asp.net核心 – 如何在Asp.Net Core中注册同一个接口的多个实现
我有从同一个接口派生的服务
public interface IService { } public class ServiceA : IService { } public class ServiceB : IService { } public class ServiceC : IService { } 通常,其他诸如Unity的IOC容器允许您通过区分它们的某些Key注册具体的实现. 在Asp.Net Core中如何注册这些服务,并在运行时根据一些关键点解决它们? 我没有看到任何Add Service方法采用通常用于区分具体实现的key或name参数. public void ConfigureServices(IServiceCollection services) { // How do I register services here of the same interface } public MyController:Controller { public void DoSomeThing(string key) { // How do get service based on key } } 工厂模式是唯一的选择吗? UPDATE1 public class ServiceA : IService { private string _efConnectionString; ServiceA(string efconnectionString) { _efConnecttionString = efConnectionString; } } public class ServiceB : IService { private string _mongoConnectionString; public ServiceB(string mongoConnectionString) { _mongoConnectionString = mongoConnectionString; } } public class ServiceC : IService { private string _someOtherConnectionString public ServiceC(string someOtherConnectionString) { _someOtherConnectionString = someOtherConnectionString; } } _serviceProvider.GetService()如何注入适当的连接字符串? 还要注意,我试图避免使用其他容器(包括Unity),因为我必须使用新的容器注册所有其他容器(例如Controllers). 使用工厂模式创建服务实例也是针对DIP,因为工厂增加了客户端被迫依赖于details here的依赖关系 所以我认为默认DI在ASP.NET内核缺少2件事情 解决方法
它不受Microsoft.Extensions.DependencyInjection的支持.
但是您可以插入另一个依赖注入机制,如StructureMap See it’s Home page,它是GitHub Project. 这不难: >在project.json中添加一个依赖关系到StructureMap: "Structuremap.Microsoft.DependencyInjection" : "1.0.1", >将其注入到配置服务中的ASP.NET管道中,并注册您的类(see docs) public IServiceProvider ConfigureServices(IServiceCollection services) // returns IServiceProvider ! { // Add framework services. services.AddMvc(); services.AddWhatever(); //using StructureMap; var container = new Container(); container.Configure(config => { // Register stuff in container,using the StructureMap APIs... config.For<IPet>().Add(new Cat("CatA")).Named("A"); config.For<IPet>().Add(new Cat("CatB")).Named("B"); config.For<IPet>().Use("A"); // Optionally set a default config.Populate(services); }); return container.GetInstance<IServiceProvider>(); } >然后,要获取命名实例,您需要请求IContainer public class HomeController : Controller { public HomeController(IContainer injectedContainer) { var myPet = injectedContainer.GetInstance<IPet>("B"); string name = myPet.Name; // Returns "CatB" 而已. 对于要构建的示例,您需要 public interface IPet { string Name { get; set; } } public class Cat : IPet { public Cat(string name) { Name = name; } public string Name {get; set; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在asp.net core 2.0中使用identityserver4时的无限认证循环
- Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文
- asp.net – 使用客户端标记链接相对于Application root
- Phonegap上的ASP.NET窗体身份验证问题(Android)
- asp.net – 在mod_mono和Apache上的Appdomain回收设置
- asp.net-mvc – angular js和asp.net mvc 4示例应用程序
- 如果我应该开始使用asp.net mvc 4而不是asp.net MVC 3,我可
- asp.net-mvc – MVC 3 Webgrid – 你如何隐藏不想显示的列?
- asp.net – 如何在使用System.Web.Optimization时将type =“
- 经过几个小时的使用后,ASP.NET Web应用程序是否会“静止”?
- asp.net – Request.Browser.Platform不返回iPad
- 如何从经典ASP输出Excel * .xls文件
- asp.net – 在SQL SERVER 2005上启用CLR是否存在
- asp.net-mvc – 从ASP.NET MVC 1迁移到ASP.NET M
- asp.net-mvc – JqGrid隐藏/显示列
- 捕获到ASP.NET ASMX Web服务的SOAP请求
- asp.net – 太多的Cookie OpenIdConnect.nonce导
- asp.net – SVG的图像在浏览器与PNG后备
- asp.net – 禁止从IIS 7继承“允许所有用户”规则
- asp.net – 如何在MVC4的部分视图中添加脚本?