我试图为我的解决方案实现组合根,该解决方案由多个应用程序和几个类库组成。我使用简单的注入器作为我选择的DI框架。
拥有多个应用程序需要多个组合根。但是,我不希望在每个组合根中有重复的容器注册。因此,我正在考虑使用https://stackoverflow.com/a/11993030/852765中提到的方法,但遇到了一些问题。
如何在申请的基础上覆盖注册的生命周期?具体来说,我希望覆盖一些容器注册,以便在我的Web应用程序中具有“每个Web请求生命周期”,而我的其他应用程序则使用一个短暂的生命周期来进行相同的注册。
发布于 2014-10-08 14:56:47
诀窍是将范围内的生活方式之一传递到组合根的集中部分。您可以通过使用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实例:
ScopedLifestyle mixedScopeLifestyle = Lifestyle.CreateHybrid(
() => HttpContext.Current != null,
new WebRequestLifestyle(),
new LifetimeScopeLifestyle());https://stackoverflow.com/questions/26259320
复制相似问题