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; }
} (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- jwt – ASP.NET 5 OAuthBearerAuthentication:以下认证方案
- asp.net-web-api – 在Visual Studio中启动WebAPI项目的最简
- 是否可以优化ASP.NET WebForms以便像ASP.NET MVC一样快速执
- asp.net-mvc – RazorEngine:不能使用Html.Raw
- asp.net – 网站无法启动另一个网站可能使用相同的端口
- asp.net – 什么是错误代码是0x80070001?那我该怎么解决呢
- asp.net repeater手写分页实例代码
- asp.net-mvc-3 – 实体框架乐观并发异常未发生
- asp.net – JS / CSS包括部分替换,Debug vs Release
- ASP.NET代码生成器
- asp-classic – ASP页面中的msxml3.dll错误“800
- asp.net – 从_layout.cshtml将常量值传递给Angu
- asp.net-core – .NET Core SDK安装程序无法在Wi
- asp.net-core – Asp.net vNext中的bindingRedir
- asp.net – 使用jQuery以编程方式触发JavaScript
- asp.net-mvc – 使用IIS7.5将网站中的URL绑定到另
- 本地化 – 了解MVC6 RC1中的资源文件
- asp.net-mvc – ASP.NET MVC编辑集合最佳实践 –
- asp.net-mvc – 当参数为Model时,ASP.NET MVC发布
- asp.net-core – 在.NET Core Web API上为CORS启
