在Simple Injector中将生活方式与自动接线相结合是否可行

莫雷克

我正在使用Simple Injector,以使我的代码能够自动连接到事件总线消息在自动布线期间,我INotificationHandlers允许将不同的生活方式潜在地用于不同的具体实现,如下所示:

public static Lifestyle GetLifestyleForType(
    Type type, Container container, Dictionary<Type,Lifestyle> list = null)
{
    if (list is null) return container.Options.DefaultLifestyle;

    return list.TryGetValue(type, out var lifestyle)
        ? lifestyle : container.Options.DefaultLifestyle;
}

public static void Wire(Container container)
{
    var lifestyles = new Dictionary<Type, Lifestyle> {
        { typeof(FirstClass), Lifestyle.Singleton },
        { typeof(OtherClass), Lifestyle.Transient }
    };

    var handlerTypes = container
        .GetTypesToRegister(typeof(INotificationHandler<>), typeof(OtherClass).Assembly);

    var handlerProducers = (
        from type in handlerTypes
        from interfaceType in type.GetClosedTypesOf(typeof(INotificationHandler<>))
        let producer = GetLifestyleForType(type, container, lifestyles)
            .CreateProducer(interfaceType, type, container)
        group new { type, producer } by interfaceType into interfaceGroup
        select new
        {
            interfaceGroup.Key,
            Value = (
                from pair in interfaceGroup
                group pair.producer by pair.type into concreteGroup
                select new { concreteGroup.Key, Value = concreteGroup.ToArray() })
                .ToDictionary(i => i.Key, i => i.Value)
        }).ToDictionary(i => i.Key, i => i.Value);
}

我注意到,在所有其他自动接线示例中,都假定使用了相同的生活方式(尚未看到指定的生活方式)-出于任何原因(防止做危险的事情)?

另外,Lifestyle.Transientasync/await运营商的工作方式不同吗?我刚刚意识到一直在使用Transient生命周期,SimpleInjector而没有我知道的任何不良影响,假设我默认情况下应切换到Lifestyle.Scoped(如我上面的接线)container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle()

史蒂文

我注意到,在所有其他自动接线示例中,都假定使用了相同的生活方式(尚未看到指定的生活方式)-出于任何原因(防止做危险的事情)?

默认情况下,Simple Injector使用Transient默认生活方式。这意味着,除非您明确提供生活方式的注册信息,否则Simple Injector会使用默认的生活方式,即Transient

尽管为操作员使用多种生活方式并没有天生的错误,但是使用多种生活方式确实会增加解决方案的复杂性(您可能已经注意到),因此您应该问自己是否真的需要这种复杂性。除非您希望使对象图从上到下都是单例(但这会导致模型完全不同),否则我建议保持解决方案简单,并坚持使用Transient替代方法。作为一般经验法则,请设置您的根类型(处理程序,控制器,视图模型等)Transient

但是,Transient生活方式会带来一些后果。Transient组件不会被丢弃,并且由于Transient组件不会被重用,因此它们不能用于任何数据缓存。

但是,可以通过将任何有关处理和缓存的逻辑移到根类型的依赖项来轻松解决这些问题。您可以使这些依赖项Scoped甚至是Singleton我通常会对系统中在IDisposable内部实现或缓存任何状态的任何处理程序不满意。将这种逻辑移出处理程序,不仅可以“解决”Transient生活方式的局限性,而且我认为这将导致设计更好的系统。这也使推理处理程序变得更加容易。他们可以做什么,不能做什么以及他们的生活方式是什么。对于所有在系统上工作的开发人员(以及将来的任何开发人员),最容易理解的是所有处理程序始终具有相同的生活方式。

另外,Lifestyle.Transient与异步/等待操作员的工作方式是否有所不同?

Transient生活方式是有最简单的生活方式; 对于Simple Injector而言Transient,这是无人操作的。实例已创建并被遗忘(未跟踪)。在异步操作中运行时,它不会有任何不同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Simple Injector根据消费者的生活方式有条件地注册装饰器?

来自分类Dev

Simple Injector-批处理/自动注册新类

来自分类Dev

Simple Injector-批处理/自动注册新类

来自分类Dev

Simple Injector是否可以通过对象工厂注册RegisterConditional?

来自分类Dev

如何使用Simple Injector注册Windows窗体

来自分类Dev

如何使用Simple Injector注册AutoMapper 4.2.0

来自分类Dev

Simple Injector - Register foreach type with parameter

来自分类Dev

ContextDependent实例作为Simple Injector中的Singleton

来自分类Dev

用Simple Injector替换Ninject代码

来自分类Dev

ContextDependent实例作为Simple Injector中的Singleton

来自分类Dev

使用通用存储库实现Simple Injector

来自分类Dev

用Simple Injector包装通用类型

来自分类Dev

延迟在Simple Injector中创建实例

来自分类Dev

使用 Simple Injector 注册多个 DbContext

来自分类Dev

Simple Injector .NET Standard NuGet 包 PDB

来自分类Dev

温莎城堡的论点约束生活方式

来自分类Dev

如何实现PerGraph生活方式

来自分类Dev

如何实现PerGraph生活方式

来自分类Dev

PerWebRequest生活方式的工厂方法

来自分类Dev

NLog 包装类的生活方式

来自分类Dev

是否有任何技术原因使Simple Injector无法在.NET 4.0上支持Web API?

来自分类Dev

使用Owin和Simple Injector进行UserManager依赖项注入

来自分类Dev

Simple Injector + Caliburn Micro 2.0,解析视图时出错

来自分类Dev

如何使用Simple Injector注册命名实例

来自分类Dev

使用Simple Injector注册相同类型的实例

来自分类Dev

删除Simple Injector中已注册的装饰器

来自分类Dev

将IsClosedTypeOf从autofac转换为simple.injector

来自分类Dev

在Simple Injector中对拦截的方法调用进行调用的函数

来自分类Dev

Simple Injector手动注册控制器

Related 相关文章

  1. 1

    如何使用Simple Injector根据消费者的生活方式有条件地注册装饰器?

  2. 2

    Simple Injector-批处理/自动注册新类

  3. 3

    Simple Injector-批处理/自动注册新类

  4. 4

    Simple Injector是否可以通过对象工厂注册RegisterConditional?

  5. 5

    如何使用Simple Injector注册Windows窗体

  6. 6

    如何使用Simple Injector注册AutoMapper 4.2.0

  7. 7

    Simple Injector - Register foreach type with parameter

  8. 8

    ContextDependent实例作为Simple Injector中的Singleton

  9. 9

    用Simple Injector替换Ninject代码

  10. 10

    ContextDependent实例作为Simple Injector中的Singleton

  11. 11

    使用通用存储库实现Simple Injector

  12. 12

    用Simple Injector包装通用类型

  13. 13

    延迟在Simple Injector中创建实例

  14. 14

    使用 Simple Injector 注册多个 DbContext

  15. 15

    Simple Injector .NET Standard NuGet 包 PDB

  16. 16

    温莎城堡的论点约束生活方式

  17. 17

    如何实现PerGraph生活方式

  18. 18

    如何实现PerGraph生活方式

  19. 19

    PerWebRequest生活方式的工厂方法

  20. 20

    NLog 包装类的生活方式

  21. 21

    是否有任何技术原因使Simple Injector无法在.NET 4.0上支持Web API?

  22. 22

    使用Owin和Simple Injector进行UserManager依赖项注入

  23. 23

    Simple Injector + Caliburn Micro 2.0,解析视图时出错

  24. 24

    如何使用Simple Injector注册命名实例

  25. 25

    使用Simple Injector注册相同类型的实例

  26. 26

    删除Simple Injector中已注册的装饰器

  27. 27

    将IsClosedTypeOf从autofac转换为simple.injector

  28. 28

    在Simple Injector中对拦截的方法调用进行调用的函数

  29. 29

    Simple Injector手动注册控制器

热门标签

归档