我正在尝试为包含多个应用程序和多个类库的解决方案实现组合根。我使用Simple Injector作为我选择的DI框架。
拥有多个应用程序需要多个组合根。但是,我不希望在每个组合根中都有重复的容器注册。因此,我正在考虑使用https://stackoverflow.com/a/11993030/852765中提到的方法,但遇到了问题。
如何根据应用程序覆盖注册的生命周期?具体来说,我想覆盖一些容器注册,以在我的Web API应用程序中具有“每个Web API请求生命周期”,而我的其他应用程序使用瞬态生命周期进行相同的注册。
答案 0 :(得分:2)
诀窍是将其中一个范围生活方式传递到组合根的集中部分。您可以使用ScopedLifestyle
基类:
public static class BusinessLayerBootstrapper
{
public static void Bootstrap(Container container, ScopedLifestyle scopedLifestyle)
{
container.Register<IUnitOfWork, MyDbContext>(scopedLifestyle);
// etc...
}
}
在您的最终应用程序中,您可以按如下方式调用:
public class Global : Application
{
protected override Application_Start()
{
var container = new Container();
container.RegisterMvcControllers();
BusinessLayerBootstrapper.Bootstrap(container, new WebRequestLifestyle());
DependencyResolver.SetResolver(
new SimpleInjectorDependencyResolver(container));
}
}
尽管在使用Lifestyle
基类本身时同样有效,但此类缺少您可能感兴趣的某些功能,例如RegisterForDisposal
,GetCurrentScope
和WhenScopeEnds
当您创建混合生活方式时,传递ScopedLifestyle
甚至可以正常工作,因为有Lifestyle.CreateHybrid
重载需要两个ScopedLifestyle
实例并返回一个新的ScopedLifestyle
实例:< / p>
ScopedLifestyle mixedScopeLifestyle = Lifestyle.CreateHybrid(
() => HttpContext.Current != null,
new WebRequestLifestyle(),
new LifetimeScopeLifestyle());