.net-coredependencyinjection我有一个Genericrepository,我想注册DI,它实现了一个接口IRepository。通常我会像这样创建一个实例:IRepositoryrepo=newRepository();但是我试图在发布之前加速.net5并想将它与DI一起使用,我采用了以下方法:services.AddTransient();但这感觉不对,我不想在我的模型中的每个类中都有50多行......我在网上找不到任何关于这个的东西,我知道它可能与其他ioc容器有关......但由于这是一个学习项目,我不想使用其他容器,我的目标是使用.net5s本机容器来完成所有这些工作。您应该能够注册开放通用服务。AddTransient(typeof(IRepository),typeof(Repository));在对其他答案的评论中进行一些回复和转发后,我有一个可行的解决方案,它可能不是最好的方法,但它确实有效。如果我找到更好的方法,我会再次更新。我遇到的两个问题是:需要注册一个通用接口,这里的问题是我的重点。我当然注册了一个语法错误的泛型类型:services.AddTransient(typeof(IRepository),typeof(Repository));第二个问题是我有一个包含50多个不同模型的程序集,我想注册。我解决这个问题的方法是编写一个方法,我可以传递一个程序集列表以及我想要注册的命名空间,它迭代任何符合条件的类型并将它们注册到DI容器。publicvoidRegisterModels(IServiceCollectionservices,string[]Assemblies,string@NameSpace){foreach(varainAssemblies){AssemblyloadedAss=Assembly.Load(a);varq=fromtinloadedAss.GetTypes()wheret.IsClass&&!t.Name.Contains("Thencallitfromstartup.csmethodConfigureServices:publicvoidConfigureServices(IServiceCollectionservices){//添加框架服务。服务。添加实体框架()"UI"},"UI.Models");services.AddTransient(typeof(IRepository),typeof(Repository));}可能有更好的方法,绝对使用不同的DI容器,如果有人告诉我提供了一个改进。你可以使用一个基于会话的注册表库,比如Scrutor。Scrutor是一个小型的开源库,它提供了一个流畅的API,可以根据约定在Microsoft.Extensions.DependencyInjection容器中注册服务(类似于Autofac的RegisterAssemblyTypes方法、StructureMap的Scan方法和Ninject的约定包)。这将允许您执行以下操作:;返回allInterfaces.Any(y=>y.GetTypeInfo().IsGenericType&&y.GetTypeInfo().GetGenericTypeDefinition()==typeof(IRepository)));})).AsSelf().WithTransientLifetime());你可以做的想法是创建一个扩展方法,封装所有需要注册的单个项目。这与Microsoft使用的技术相同,例如你只在启动时使用它:services.AddMvc();但它是一种扩展方法,在幕后你可以打赌它注册了一堆它需要的东西。所以你可以像这样创建你自己的扩展方法:usingMicrosoft.Extensions.DependencyInjection;publicstaticIServiceCollectionAddMyFoo(这个IServiceCollection服务){services.AddTransient,DAL.Repository>();//....返回服务;并且您可以通过使该方法返回IServiceCollection使其流畅,因此您可以执行services.AddMyFoo().AddSomeOtherFoo();根据评论更新另一种减少注册的技术是当您的依赖项本身没有依赖项时,您可以将构造函数的默认值设置为空,这样您仍然可以解耦并稍后传递一个不同的值,但DI不会抛出错误,如果您不这样做'传入,你可以实例化你需要的东西。publicclassMyFoo(IFooItemDependencymyItem=null){privateIFooItemDependencyinternalItem;publicMyFoo(IFooItemDependencymyItem=null){serviceItem=myItem??新的FooItemItem();AddTransient,DAL.Repository>();services.AddTransient,DAL.Repository>();services.AddTransient,DAL.Repository>();等我以前做过这个(使用ninject)Bind(typeof(IRepository))。To(typeof(Repository)).InRequestScope();我认为,对于Unity,你可以做一些类似services.AddTransient,typeof(Repository)();的事情。然后在服务中使用它publicOrderService(IRepositoryorderRepository){this.orderRepository=orderRepository;编辑正如OP指出的那样,正确的语法是:以上是C#学习教程的全部内容:.net-coredependencyinjection。多加注意---services.AddTransient(typeof(IRepository),typeof(Repository));本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: