【发布时间】:2015-07-29 08:29:27
【问题描述】:
我正在尝试使用新的 ASP.NET MVC 6 内容,但我很难使用他们的新 DI 系统。我尝试在网上查找资源,但我找到的所有内容都只涵盖了使用它的绝对最低限度。
我以前使用Ninject,我有几个这样的接线:
Bind<IDocumentStore>()
.ToMethod(c => CreateDocumentStore())
.InSingletonScope();
private static IDocumentStore CreateDocumentStore() {
// lots of initialization code, etc.
return documentStore;
}
但到目前为止,我很难找出如何将这种行为转化为微软的新 DI 系统。我能找到的都是这样的例子:
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
和:
services.AddMvc();
似乎一切都完全在目标服务的默认构造函数上运行。有什么方法可以在这个新的 DI 系统中产生我需要的行为?
我看过
services.Configure<TOptions>(options => {});
但我不太清楚这是否会符合我的想法,或者它是否是为特定行为保留的。
【问题讨论】:
-
您为什么要尝试从 Ninject 迁移到新的 DI 系统?新的 DI 系统仅支持 Ninject(和其他容器)支持的一部分,内置的 DI 系统将是 unusable for any reasonably sized SOLID application。
-
我不怀疑你是对的,但老实说,你的大部分帖子都超出了我的想象。我基本上只需要构造函数注入,并且可能需要一次属性注入。但我会努力研究更多
-
好吧,老实说,我不认为我曾经使用过属性注入;我只是使用构造函数注入。但是,一旦您开始添加横切关注点,例如日志记录、审计跟踪、权限检查、验证、事务管理等,如果您有 an architecture 允许您在使用 [decorators](en.wikipedia.org/wiki/Decorator_pattern) 的简单而优雅的方式。在 vNext 容器中应用装饰器是不可能的,因为您可以在其中一个成熟的容器中使用。
标签: asp.net-mvc dependency-injection asp.net-core-mvc