C# 每个web请求和上下文的简单注入器寄存器

C# 每个web请求和上下文的简单注入器寄存器,c#,dependency-injection,simple-injector,C#,Dependency Injection,Simple Injector,有registerWebRequest和RegisterWithContext(这一个最初不是随简单注入器一起提供的,但它是在其上提供的)。分开来看,这两种方法都很好,但我需要将它们结合起来 我发现在registerWebRequest中使用了newWebRequestLifestyle()lifestyle(找到了它)。因此,我提供了new WebRequestLifestyle(),而不是使用Lifestyle.TransientRegisterWithContext,但是Dependenc

registerWebRequest
RegisterWithContext
(这一个最初不是随简单注入器一起提供的,但它是在其上提供的)。分开来看,这两种方法都很好,但我需要将它们结合起来

我发现在
registerWebRequest
中使用了
newWebRequestLifestyle()
lifestyle(找到了它)。因此,我提供了
new WebRequestLifestyle()
,而不是使用
Lifestyle.Transient
RegisterWithContext
,但是
DependencyContext.ImplementationType
DependencyContext.ServiceType
似乎为空

这有什么不对

更新1。

因此,我希望按照web请求注册类型,就像
registerWebRequest
一样,而且能够为实例创建者提供对注入注册类型的类型的访问

我将(提取生活方式作为参数)
RegisterWithContext
修改为:

public static void RegisterWithContext<TService>(
    this Container container,
    Func<DependencyContext, TService> contextBasedFactory, Lifestyle lifestyle)
    where TService : class
{
    //original code

    container.Register<TService>(rootFactory, lifestyle);

    //original code
}
公共静态无效注册表WithContext(
这个集装箱,
Func contextBasedFactory,生活方式)
where-TService:class
{
//原始代码
容器。注册(根工厂、生活方式);
//原始代码
}
对于“每个web请求和上下文”注册,我希望能够使用:

container.RegisterWithContext<IUnitOfWork>(dependencyContext =>
{
      var implementationType = dependencyContext.ImplementationType;
      //do some stuff and return preconfigured UnitOfWork
}, new WebRequestLifestyle());
container.RegisterWithContext(dependencyContext=>
{
var implementationType=dependencyContext.implementationType;
//做一些事情并返回预配置的UnitOfWork
},新的WebRequestLifestyle());
正如我已经提到的
dependencyContext.ImplementationType
NULL


我使用的是SimpleInjector 2.3.0.0

扩展方法
RegisterWithContext
将提供的委托显式注册为
Transient
。这样做是因为在任何其他生活方式中注册类型都没有意义

WebRequestLifestyle
这样的生活方式的想法是在整个对象图中缓存和重用相同的实例(可能还不止于此)。然而,在处理基于上下文的注册时,这个概念没有什么意义,因为基于上下文的实例在每次被注入时都是不同的。换句话说,为每个使用者提供一个唯一的实例与重用同一实例的概念相冲突

以下面的对象图为例:

new HomeController(
    new Logger("HomeController"),
    new LoggingRepositoryDecorator<User>(
        new Logger("LoggingRepositoryDecorator<User>"),
        new SqlRepository<User>(
            new DbContext())),
    new LoggingCommandHandlerDecorator<ShipOrder>(
        new Logger("LoggingCommandHandlerDecorator<ShipOrder>"),
        new ShipOrderCommandHandler(
            new DbContext())));
ILogger logger = new Logger(typeName: "HomeController");

new HomeController(
    logger,
    new LoggingRepositoryDecorator<User>(
        logger,
        new SqlRepository<User>(
            new DbContext())),
    new LoggingCommandHandlerDecorator<ShipOrder>(
        logger,
        new ShipOrderCommandHandler(
            new DbContext())));
但是,如果我们允许
ILogger
注册到
webrequestlifiety
,那么每次都应该应用相同的实例,这可能会导致以下对象图:

new HomeController(
    new Logger("HomeController"),
    new LoggingRepositoryDecorator<User>(
        new Logger("LoggingRepositoryDecorator<User>"),
        new SqlRepository<User>(
            new DbContext())),
    new LoggingCommandHandlerDecorator<ShipOrder>(
        new Logger("LoggingCommandHandlerDecorator<ShipOrder>"),
        new ShipOrderCommandHandler(
            new DbContext())));
ILogger logger = new Logger(typeName: "HomeController");

new HomeController(
    logger,
    new LoggingRepositoryDecorator<User>(
        logger,
        new SqlRepository<User>(
            new DbContext())),
    new LoggingCommandHandlerDecorator<ShipOrder>(
        logger,
        new ShipOrderCommandHandler(
            new DbContext())));
ILogger logger=新的记录器(类型名称:“HomeController”);
新家庭控制器(
记录器,
新型LoggingRepositoryDecorator(
记录器,
新SqlRepository(
新建DbContext()),
新LoggingCommandHandlerDecorator(
记录器,
新ShipOrderCommandHandler(
新的DbContext());
在这个对象图中,注入了相同的
记录器(“HomeController”)
,这显然不是我们想要的。此外,行为变得非常不可预测,因为首先创建的消费者将决定记录器的
typeName
,它将在整个图形中重用。但是没有人会期望从
HomeController
的构造函数中删除
ILogger
会导致
LoggingCommandHandlerDecorator
的记录器发生更改


这就是为什么在
RegisterWithContext
扩展方法中没有
Lifestyle
参数的原因。

您能更具体一点吗?你想用什么方式混合它们?你能给出一个你需要的代码示例吗?您使用的是哪种版本的简易注射器?亲爱的@Steven我已经更新了我的问题。通常,我试图实现的是在某些特殊情况下为某些选定的存储库提供不同的连接字符串。希望对你有所帮助。谢谢你这么描述性的回答,我对简单注射器的一些原理有了深刻的理解。感谢您为simple injector开发所做的一切努力和贡献。