【问题标题】:Translating Ninject to ASP.NET MVC 6 DI将 Ninject 转换为 ASP.NET MVC 6 DI
【发布时间】: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


【解决方案1】:

AddTransient 方法有各种重载,其中一个接受 lambda 表达式:

services.AddTransient<IDocumentStore>(s => CreateDocumentStore());

不过,您似乎使用的是 Ninject InSingletonScope() 修饰符,所以这可能更合适:

services.AddSingleton<IEmailSender>(s => CreateDocumentStore());

补充说明:有一些pre-release documentation 可用(当然,它不完整,可能不正确,但可能会有所帮助)

【讨论】:

  • services.AddSingleton 还允许使用工厂 lambda,并且相当于 Ninject 注册。
  • @PaulHiles 你可能是对的,我对 Ninject 了解不多。我将在其中进行编辑。
  • 对不起,我试过了,你说的方法好像不存在。
  • @Ciel 我刚刚对其进行了测试以确认并且这些都适用于我的版本。也许您正在运行旧版本?
  • 是的,你是对的。有什么东西阻止它显示。擦洗并重新安装后,它工作正常!
【解决方案2】:

您还可以通过将 Microsoft.Framework.DependencyInjection.Ninject 添加到您的项目中来继续使用 Ninject,然后使用以下代码对其进行配置:

public IServiceProvider ConfigureServices(Microsoft.Framework.DependencyInjection.IServiceCollection services)
{
    var kernel = CreateMyKernel();
    kernel.Populate(services); // Wire up configured services and Ninject kernel with Microsoft tool
    return kernel.Get<IServiceProvider>();
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 2023-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多