C# 使用简单喷油器在特定于应用程序的基础上覆盖生命周期

C# 使用简单喷油器在特定于应用程序的基础上覆盖生命周期,c#,asp.net-web-api,dependency-injection,simple-injector,C#,Asp.net Web Api,Dependency Injection,Simple Injector,我正在尝试为我的解决方案实现由多个应用程序和几个类库组成的组合根。我选择使用SimpleInjector作为DI框架 拥有多个应用程序需要多个合成根。但是,我不希望在每个合成根中都有重复的容器注册。因此,我正在考虑使用中提到的方法,但遇到了问题 如何根据应用程序覆盖注册的生命周期?具体地说,我想覆盖一些容器注册,以便在我的Web API应用程序中有一个“每个Web API请求生命周期”,而我的其他应用程序使用一个临时生命周期来进行相同的注册。诀窍是将一个范围内的生命方式传递到合成根的集中部分。您

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

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


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

诀窍是将一个范围内的生命方式传递到合成根的集中部分。您可以使用
ScopedLifestyle
基类:

public static class BusinessLayerBootstrapper
{
    public static void Bootstrap(Container container, ScopedLifestyle scopedLifestyle)
    {
        container.Register<IUnitOfWork, MyDbContext>(scopedLifestyle);

        // etc...
    }
}
虽然这在使用
生活方式
基类本身时同样有效,但该类缺少一些您可能感兴趣的功能,例如
RegisterForDisposal
GetCurrentScope
WhenScopeEnds

传递
ScopedLifestyle
甚至在创建混合生活方式时也有效,因为存在
生活方式。CreateHybrid
重载接收两个
ScopedLifestyle
实例并返回一个新的
ScopedLifestyle
实例:

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