简单的注入器使用Initialize() - 方法自动连接

时间:2016-01-26 09:13:57

标签: c# simple-injector

我正在使用简单注入器和构造函数注入,我喜欢ctr-Arguments的自动连接功能。初始化方法是否有类似的自动线方式?

因此,不要向构造函数提供参数,而是通常不可能执行异步内容,而是通过自动连接向Initialize()方法提供内容

public class A
{
   // only std-ctor ()
   [Init] // maybe mark needed?
   void /*async*/ Initialize(IC c, IB b)
   {
      // get auto called by container and params auto-wired
      // maybe do async stuff with b
   }

}

// in Composition root (for simplicity):
container.RegisterSingleton<A>();

因此,异步可能性将是一个加号功能。

[更新]

因此async合理地不是您在对象图创建中所需的功能。所以我们不要把重点放在那上面。但有时候仍然需要使用init(即如果需要一个() - 构造函数)。我意识到通过简单的注入器自动调用Initialize()导致无意义。我只是看到有时需要拆分对象创建和初始化,自动布线太酷了。那么如何激活或实施呢?那么简单的Injector会为你自动连线吗?我希望我不必编写一个“初始化类”,我必须“管理”所有依赖项。这就是问题的实际方向(得到Magic.AutoWire())。

   public class SomeClassWithA
   {
      A _a;
      public SomeClassWithA(A a)
      {
        _a=a;
      }

      void CalledLater()
      {
         Magic.AutoWire(_a);
         // Initialize with auto-wire parameters was called
      }
    }

1 个答案:

答案 0 :(得分:3)

尽管可以在对象图初始化期间扩展Simple Injector以调用初始化方法,但是由于Simple Injector缺少异步API,因此无法使其真正异步。如果没有“Task<T> GetInstanceAsync<T>()”方法,应用程序仍然可以通过阻塞线程来等待I / O,而不是使用I / O完成端口,这将完全浪费使用异步的好处。

但Simple Injector缺乏这样的异步功能,这是故意的(而AFAIK大多数DI库缺乏这样的功能,原因完全相同)。对象图的构造应该很快,不应该包含任何I / O.构造函数(或具有依赖项的初始化程序)除了存储传入的依赖项之外,应该只做其他事,因为Mark Seemann明确指出here

这基本上意味着你应该延迟任何I / O直到对象图构造之后直到第一次使用对象的那一刻。这不仅使对象构造简单,快速和可靠,而且还可以隔离地验证您的注入图的构造(不存在任何I / O组件,如数据库或文件系统)。