我正在使用.net内核, 我有一个简单的界面,例如:
export default new UserService();
我有很多实现它的类,一个示例类:
public interface ITask
{
string TaskName { get; }
void Execute(TaskDetails item);
}
然后我得到了DI部分,在其中为每个课程添加一行-
public class Task1Adapter : ITaskAdapter
{
public string TaskName => "MyTask...";
public void Execute(TaskDetails item)
{
var x = 1 + 1;
}
}
我的问题是我有很多任务,如果可能的话,我宁愿避免使用100条以上的AddSingleton行。
是否有一种方法可以一次性添加实现该接口的所有类,而不必为要添加的每个新类添加services.AddSingleton<ITaskAdapter, Task1Adapter>();
逻辑?
编辑: 由于我需要调用不同的任务/类来动态地实现该接口,因此我在运行时使用了以下逻辑-
AddSingleton
答案 0 :(得分:1)
您可以将Ninject与约定名称一起使用。检查以下示例:
https://github.com/jhonmarmolejo/DemoMVC/blob/master/Demo.MVC/App_Start/NinjectWebCommon.cs
在第57行中,我根据特定规则实现了所有接口
/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
kernel.Bind(ker =>
{
ker.FromAssembliesMatching("*Business.Implementation*").SelectAllClasses().BindAllInterfaces();
});
}
要使用它,您需要以下nuget:
https://www.nuget.org/packages/Ninject.Extensions.Conventions/
希望对您有帮助 问候 俊
答案 1 :(得分:0)
更新我之前的回复:.NET Core 允许使用反射注册您的实现
services.Scan(scan => scan
.FromAssemblyOf<EmailService>()
.AddClasses(classes => classes.Where(c => c.Name.EndsWith("Service")))
.UsingRegistrationStrategy(RegistrationStrategy.Skip)
.AsImplementedInterfaces()
.WithSingletonLifetime());
您只需执行以下步骤: