使用Simple Injector在特定应用程序的基础上覆盖生命周期

时间:2014-10-08 14:23:26

标签: c# asp.net-web-api dependency-injection simple-injector

我正在尝试为包含多个应用程序和多个类库的解决方案实现组合根。我使用Simple Injector作为我选择的DI框架。

拥有多个应用程序需要多个组合根。但是,我不希望在每个组合根中都有重复的容器注册。因此,我正在考虑使用https://stackoverflow.com/a/11993030/852765中提到的方法,但遇到了问题。

如何根据应用程序覆盖注册的生命周期?具体来说,我想覆盖一些容器注册,以在我的Web API应用程序中具有“每个Web API请求生命周期”,而我的其他应用程序使用瞬态生命周期进行相同的注册。

1 个答案:

答案 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基类本身时同样有效,但此类缺少您可能感兴趣的某些功能,例如RegisterForDisposalGetCurrentScopeWhenScopeEnds

当您创建混合生活方式时,传递ScopedLifestyle甚至可以正常工作,因为有Lifestyle.CreateHybrid重载需要两个ScopedLifestyle实例并返回一个新的ScopedLifestyle实例:< / p>

ScopedLifestyle mixedScopeLifestyle = Lifestyle.CreateHybrid(
    () => HttpContext.Current != null,
    new WebRequestLifestyle(),
    new LifetimeScopeLifestyle());