0

은 내 비즈니스 계층 수준 (간체 코드)에서 다음 클래스 한 다음 MVC 측에 나는 수명을 제어 할 수 PerRequestLifetimeManager유니티 자식 컨테이너 HierarchicalLifetimeManager의 MVC 및 Windows 서비스

public class StatusUpdater : IStatusUpdater 
{ 
    private readonly IStatusRepo _statusRepo; 

    public class StatusUpdater(IStatusRepo statusRepo) 
    { 
     _statusRepo = statusRepo; 
    } 

    public voic UpdateStatus(int id, string newStatus) 
    { 
     _statusRepo.UpdateStatus(id,newStatus); 
    } 
} 

그래서 현재 사용하고 DbContext

하지만 지금은 Windows 서비스에 나는 그것을 사용할 수 없습니다, 그래서 나는 다음을 수행하려고했지만,이 ServiceLocator처럼 많이 보이기 때문에 그것은 바로 생각하지 않습니다

using(var container = ConfiguredContainer.CreateChildContainer()) 
{ 
    var statusUpdater = container.Resolve<IStatusUpdater>(); 
    statusUpdater.UpdateStatus("test"); 
} 

다른 옵션이 있습니까?

MVC :

container.RegisterType<IStatusRepo, StatusRepo>(new PerRequestLifetimeManager()); 

윈도우 서비스 :

container.RegisterType<IStatusRepo, StatusRepo>(new HierarchicalLifetimeManager()); 
+0

'Unity'에 대해서는 확실하지 않지만 다른 DI 프레임 워크에서는 'MVC'와 'Win Service'에 대해 다른 등록 코드를 사용해야합니다. 'Resolve' 메소드에 대한 직접 호출은 DI 프레임 워크가 무엇을 위해 만들어 졌는지 항상 '냄새'가납니다 - 인스턴스가 필요할 때이를 해결해야합니다. 우리의 코드에서'.Resolve' 메소드를 호출 할 때 그것은 우리가 뭔가 잘못하고 있다는 것을 의미합니다. 생성자에 인스턴스를 삽입하고 대신 인스턴스를 사용하는 객체의 수명 범위를 변경할 수 있습니다. – Fabjan

답변

0

나는 보통 등록 및 등록의 2 종류를하지 않고 MVC 응용 프로그램에서 동일한 코드와 Windows 서비스를 사용하는 방법은 무엇입니까 자신의 어셈블리에서 내 타입, 아마도 당신처럼했을 가능성이 높지만, 실행중인 어셈블리에 특정한 것이있을 때, 나는 그것을 실행중인 어셈블리의 등록에서 덮어 씁니다.

// In BusinessProcessor 
container.RegisterType<IBusinessProcessorA, MyBusinessProcessorA1>(); 
container.RegisterType<IBusinessProcessorA, MyBusinessProcessorA2>(); 
container.RegisterType<IBusinessProcessorB, MyBusinessProcessorB1>(); 

// In DataAccessLayer 
container.RegisterType<IRepository, Repository<A>>("A", new HierarchicalLifetimeManager()); 
container.RegisterType<IRepository, Repository<B>>("B", new HierarchicalLifetimeManager()); 
container.RegisterType<IRepository, Repository<C>>("C", new HierarchicalLifetimeManager()); 

// In WindowsService 
Register(BusinessProcessor); // Call to have the BusinessProcessor register it's own things. 
Register(DataAccessLayer);  // Call to have the DataAccessLayer register it's own things. 
container.RegisterType<IService, MyService>(); 

// In WebApplication 
Register(BusinessProcessor); // Call to have the BusinessProcessor register it's own things. 
Register(DataAccessLayer);  // Call to have the DataAccessLayer register it's own things. 
container.RegisterType<IController, MyController>(); 
container.RegisterType<IRepository, Repository<A>>("A", new PerRequestLifetimeManager()); 

다른 이름 등록과 함께 DAL에서, 저장소를 등록하고 BusinessProcessors을 위해 그렇게하지만 내가 권하고 싶지 않다 그 사실을 알고 전체 솔루션을 의미 할 수있는 또 다른 방법 . 조금도.

관련 문제