c# - 我们可以注入具有不同变量的同一类的多个实例吗?
问题描述
我们可以注入具有不同变量的同一类的多个实例吗?
services.TryAddScoped<ISomeClass>(sp =>
{
return new SomeClass(1);
});
services.TryAddScoped<ISomeClass>(sp =>
{
return new SomeClass(2);
});
并且以某种方式将所需的拉到单独的控制器中。
解决方案
由于.TryAddScoped
您只有一个类型的实例,如果您使用,.AddScoped
您可以添加多个实例并在您的控制器中接收一个 IEnumerable。
如果您需要命名实例,我已经创建了我的自定义解决方案:
public class NamedService<T>
{
public string Name { get; set; }
public T Service { get; set; }
public NamedService(string name, T service)
{
Name = name;
Service = service;
}
}
扩展方法:
public static T GetService<T>(this IServiceProvider serviceProvider, string name = null) where T : class
{
if (name != null)
{
var list = serviceProvider.GetServices<NamedService<T>>();
return list.FirstOrDefault(n => n.Name == name)?.Service;
}
return serviceProvider.GetService<T>();
}
public static IServiceCollection AddScoped<T>(this IServiceCollection services, string name, Func<IServiceProvider, T> factory)
{
return services.AddScoped(sp => new NamedService<T>(name, factory(sp)));
}
用法:
Services.AddScoped("some1", s => new SomeClass(1));
Services.AddScoped("some2", s => new SomeClass(2));
控制器:
public SomeController(IServiceProvider serviceProvider)
{
var someInstance = serviceProvider.GetService<ISomeClass>("some1");
}
推荐阅读
- upgrade - Apache Ignite 从 1.8 升级到最新版本
- angular - 如何取消 Ag-grid OnFilterChanged 事件?
- javascript - Swiper.js 延迟图像加载在移动设备上以错误的高度启动
- r - 将每一行连接到 R dplyr 中的整个第二个表
- elasticsearch - Elasticsearch 查询以获取属性出现次数最少的文档列表
- javascript - 有没有办法在javascript中制作一个双输入提示框?(举例)
- html - 请问如何将标签和输入放在同一行?
- android - 我可以在编译最低 SDK 21 的同时使用 Navigate Compose 吗?
- python - 屏蔽并连接熊猫中的两个字符串系列
- reactjs - react,react-router-dom中的页面重定向问题