내 구현 내 DbContext
및 UnitOfWork
이 내 서비스 계층에있는 다중 계층 응용 프로그램이 있습니다. 이 계층에는 System.Web
에 대한 참조가 없습니다.SimpleInjector 서비스 범위의 요청 범위
함께 내 UI 레이어에서 내 확장을 사용하여 내 모든 주입을 초기화하는 내 CompositionRoot
클래스가 있습니다.
하지만 내 DbContext
및 UnitOfWork
는 요청 범위를 필요로하고, 나는 HttpContext
또는 WebRequestLifestyle
에 대한 액세스 권한을 가지고 있지 않기 때문에, 아래의 예처럼이를 설정할 수 없습니다입니다.
요청 범위를 사용하려면이 RegisterEntityFramework(...)
확장자를 내 UI 레이어로 이동해야합니까? 아니면 내 서비스 레이어에서 System.Web을 참조해야합니까?
나는 의존성 주입을 처음 접했을 뿐이므로 최고의 시나리오가 그러한 시나리오에서 무엇인지에 대해 지나치게 편집증 적이기도합니다.
ServiceLayer/EntityFramework/CompositionRoot.cs
public static class CompositionRoot
{
public static void RegisterEntityFramework(this Container container)
{
var lifestyle = Lifestyle.CreateHybrid(
lifestyleSelector:() => HttpContext.Current != null, // HttpContext not available
trueLifestyle: new WebRequestLifestyle(),
falseLifestyle: new LifetimeScopeLifestyle()
);
var contextRegistration = lifestyle.CreateRegistration<EntityDbContext, EntityDbContext>(container);
container.AddRegistration(typeof(EntityDbContext), contextRegistration);
container.AddRegistration(typeof(IUnitOfWork), contextRegistration);
}
}
UILayer/App_Start/CompositionRoot.cs
public static class RootComposition
{
public static void Configure()
{
var container = new Container();
container.RegisterEntityFramework(); // extension
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterMvcAttributeFilterProvider();
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new WebApiDependencyResolver(container);
}
}
,이 똑똑! – janhartmann
부탁드립니다. 내 /App_Start/CompositionRoot.cs에 모든 것을 연결하고 비즈니스 계층에는 별도의 "모듈"이 없습니까? – janhartmann
@meep : IMO 여러 개의 최종 응용 프로그램이있는 경우 비즈니스 계층에 '모듈'만 있어야합니다. – Steven