将 Ninject 翻译成 ASP.NET MVC 6 DI

Translating Ninject to ASP.NET MVC 6 DI

我正在尝试使用新的 ASP.NET MVC 6 东西,但我很难使用他们的新 DI 系统。我试图在网上查找资源,但我找到的所有内容都只涵盖了使用它的绝对最低限度。

我之前使用的是 Ninject,我有几个这样的线路:

Bind<IDocumentStore>()
    .ToMethod(c => CreateDocumentStore())
    .InSingletonScope();

private static IDocumentStore CreateDocumentStore() {
    // lots of initialization code, etc.
    return documentStore;
}

但到目前为止,我很难找到如何将这种行为转换为 Microsoft 的新 DI 系统。我能找到的都是这样的例子:

services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();

和:

services.AddMvc();

一切似乎都完全在目标服务的默认构造函数上运行。有什么方法可以在这个新的 DI 系统中产生我需要的行为吗?

我看过

services.Configure<TOptions>(options => {});

但我不太清楚这是否会按照我的想法进行,或者它是否保留用于特定行为。

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

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

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

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

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

您也可以通过将 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>();
}