我正在使用简单注入器和构造函数注入,我喜欢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
}
}
答案 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组件,如数据库或文件系统)。