我们可以用不同的变量注入相同 class 的多个实例吗?
Can we inject multiple instances of the same class with different variables?
我们可以用不同的变量注入同一个 class 的多个实例吗?
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");
}
我们可以用不同的变量注入同一个 class 的多个实例吗?
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");
}