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