ASP.NET Core内置的DI系统中的DI模块

3

1
你对这个答案的理解有误。这个答案明确说明了Ninject是可以使用的。 - Steven
4个回答

13

ASP.NET Core不提供任何模块支持。它的设计是为一个简单的开箱即用容器,第三方IoC容器可以插入其中。

因此,它没有自动注册、程序集扫描、装饰器、拦截器或模块。如果您需要它们,您需要使用第三方框架(AutoFac、StructureMap等)。

第三方库使用Registration方法进行注册,这些方法在ConfigureServices方法中调用,例如:services.AddXxx()

public static class MyLibraryServiceCollectionExtensions
{
    public static IServiceCollection AddMyLibrary(this IServiceCollection services)
    {
        services.TryAddScoped<IMyService,MyService>();

        return services;
    }
}

这是注册库的首选方式(因为它不依赖于任何IoC容器,除了内置的IServiceCollection之外,第三方容器在插入ASP.NET Core时也会使用它),对于像“业务逻辑库”这样的东西,实际上并不存在(以前模块很有用)。


3

除了其他很好的答案之外,您可以使用例如SimpleInjector。它是一个出色的DI容器,支持.Net Core(以及ASP.Net Core)。有关如何在.Net Core中使用它的详细信息,请在此处查看。


0
你可以尝试从 nuget 这里 获取 ServiceCollection.Extensions.Modules。

-6

Asp.Net Core提供了开箱即用的DI框架,它允许您为每个解析请求、每个Http请求或单例添加一个对象。 所有这些都在ConfigureServices方法中完成 例如:

public void ConfigureServices(IServiceCollection services)
{
    //Your configuration

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
}

你可以在这里阅读更多相关信息。

https://docs.asp.net/en/latest/fundamentals/dependency-injection.html


4
如果每个类库定义并在那里进行注册,而主应用程序仅在引导期间加载模块类,那么这并不能真正回答提问者的问题是否有模块支持。 - Tseng
为什么它没有回答问题?问题是关于ASP.NET Core对DI的支持,答案是它已经有一个现成的。那么从你的角度来看,应该是什么答案呢?为什么我们要建议使用像Ninject这样的另一个DI框架,如果已经有了内置的支持呢? - Haitham Shaddad
2
不,这个问题不是关于ASP.NET Core对DI的支持,提问者知道它已经存在。他特别询问的是模块。模块是放置在库中的类,用于执行注册,与在主应用程序中执行注册相对应。你可以在这里阅读有关Ninject中模块的信息:https://github.com/ninject/Ninject/wiki/Modules-and-the-Kernel。其他的IoC容器也有这个功能(如CastleWindsor、Autofac、Unity Container)。但是ASP.NET Core的DI没有这个功能,原因我在我的回答中已经指出了。 - Tseng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接