ASP.NET核心中的依赖注入

时间:2016-04-16 08:51:49

标签: c# dependency-injection asp.net-core

在Autofac中,您可以使用RegisterAssemblyTypes注册依赖项 所以你可以做这样的事情,有没有办法在.net Core builder.RegisterAssemblyTypes(Assembly.Load("SomeProject.Data")) .Where(t => t.Name.EndsWith("Repository")) .AsImplementedInterfaces() .InstancePerLifetimeScope(); 的{​​{1}}版本中做类似的事情

public class LeadService : ILeadService
{
    private readonly ILeadTransDetailRepository _leadTransDetailRepository;

    public LeadService(ILeadTransDetailRepository leadTransDetailRepository)
    {
        _leadTransDetailRepository = leadTransDetailRepository;
    }
}

这就是我要注册的内容

LeadService.cs

public class LeadTransDetailRepository : RepositoryBase<LeadTransDetail>, 
    ILeadTransDetailRepository
{
    public LeadTransDetailRepository(IDatabaseFactory databaseFactory) 
        : base(databaseFactory) { }
}

public interface ILeadTransDetailRepository : IRepository<LeadTransDetail> { }

LeadTransDetailRepository.cs

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();

    services.AddTransient<ILeadService, LeadService>();

    //not sure how to register the repositories
    services.Add(new ServiceDescriptor(typeof(ILeadTransDetailRepository),
        typeof(IRepository<>), ServiceLifetime.Transient));

    services.Add(new ServiceDescriptor(typeof(IDatabaseFactory),
        typeof(DatabaseFactory), ServiceLifetime.Transient));
    services.AddTransient<DbContext>(_ => new DataContext(
        this.Configuration["Data:DefaultConnection:ConnectionString"]));
}

这就是我如何尝试Regisyer,但我无法弄清楚如何注册存储库 的 Startup.cs

{{1}}

4 个答案:

答案 0 :(得分:4)

使用ASP.NET核心依赖注入/ IoC容器没有开箱即用的方法,但它的设计&#34;。

ASP.NET IoC Container / DI旨在成为添加DI功能的简单方法,并作为构建到ASP.NET Core应用程序中的其他IoC Container框架的基础。

据说它支持简单的场景(注册,尝试使用第一个构造函数,其中大多数参数都满足依赖关系和作用域依赖关系),但它缺少自动注册或装饰器支持等高级场景。

对于此功能,您必须使用第三方库和/或第三方IoC容器(AutoFac,StructureMap等)。它们仍然可以插入xquery version "1.0-ml"; declare namespace xs = "http://www.w3.org/2001/XMLSchema"; let $value1 := "antony" let $value2 := "cse" let $value3 := "year" let $value4 := "2010" let $value5 := "volume" let $value6 := "2" let $value7 := "part" let $value8 := "1" for $uri1 in cts:uris((),(), ( cts:element-query(xs:QName("P"), cts:and-query( ( cts:element-attribute-value-query(xs:QName("P"),xs:QName("name"),$value1) , cts:element-attribute-value-query(xs:QName("P"),xs:QName("value"),$value2), cts:element-attribute-value-query(xs:QName("P"),xs:QName("name"),$value3), cts:element-attribute-value-query(xs:QName("P"),xs:QName("value"),$value4), cts:element-attribute-value-query(xs:QName("P"),xs:QName("name"),$value5), cts:element-attribute-value-query(xs:QName("P"),xs:QName("value"),$value6), cts:element-attribute-value-query(xs:QName("P"),xs:QName("name"),$value7), cts:element-attribute-value-query(xs:QName("P"),xs:QName("value"),$value8) )) )) ) return doc($uri1) 您以前的注册仍然有效,但您可以获得其他功能。

答案 1 :(得分:1)

我认为您可以通过手动扫描注册所有服务。然后将它们注册到Service集合。这是我的示例代码(.Net core 2.0)

public static void ResolveAllTypes(this IServiceCollection services, string solutionPrefix, params string[] projectSuffixes)
        {
            //solutionPrefix is my Solution name, to separate with another assemblies of Microsoft,...
            //projectSuffixes is my project what i want to scan and register
            //Note: To use this code u must reference your project to "projectSuffixes" projects.

            var allAssemblies = new List<Assembly>();
            var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

            foreach (var dll in Directory.GetFiles(path, "*.dll"))
                allAssemblies.Add(Assembly.LoadFile(dll));


            var types = new List<Type>();
            foreach (var assembly in allAssemblies)
            {
                if (assembly.FullName.StartsWith(solutionPrefix))
                {
                    foreach (var assemblyDefinedType in assembly.DefinedTypes)
                    {
                        if (projectSuffixes.Any(x => assemblyDefinedType.Name.EndsWith(x)))
                        {
                            types.Add(assemblyDefinedType.AsType());

                        }
                    }
                }
            }

            var implementTypes = types.Where(x => x.IsClass).ToList();
            foreach (var implementType in implementTypes)
            {
                //I default "AService" always implement "IAService", You can custom it
                var interfaceType = implementType.GetInterface("I" + implementType.Name);

                if (interfaceType != null)
                {
                    services.Add(new ServiceDescriptor(interfaceType, implementType,
                        ServiceLifetime.Scoped));
                }

            }

        }

答案 2 :(得分:1)

我还想尝试内置,对缺少自动注册感到恼火,并为此构建了一个开源项目,看看:

https://github.com/SharpTools/SharpDiAutoRegister

只需添加nuget包SharpDiAutoRegister并在ConfigureServices方法中添加您的约定:

services.ForInterfacesMatching("^I[a-zA-z]+Repository$")
        .OfAssemblies(Assembly.GetExecutingAssembly())
        .AddSingletons();

services.ForInterfacesMatching("^IRepository")
        .OfAssemblies(Assembly.GetExecutingAssembly())
        .AddTransients();

//and so on...

答案 3 :(得分:0)

ASP.NET Core从头开始设计,以支持和利用依赖注入。

ASP.NET核心应用程序可以通过将内置框架服务注入Startup类中的方法来利用内置框架服务,并且还可以配置应用程序服务以进行注入。

ASP.NET Core提供的默认服务容器提供了一个最小的功能集,并且是

  

无意替换其他容器。

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

默认的ASP.NET容器是

  

简单且不提供强大的配置和性能   其他容器可用的选项。

幸运的是,您可以将默认容器换成一个已经作为NuGet包提供的社区创建的全功能容器。

Autofac http://autofac.org/)是已经可用于ASP.NET Core的版本,您可以通过引用

将其添加到项目中

Autofac和

Autofac.Extensions.DependencyInjection包。

来源:https://blogs.msdn.microsoft.com/webdev/2016/03/28/dependency-injection-in-asp-net-core/