如何通过依赖注入添加多个接口实现而又不一一添加

时间:2019-05-02 10:44:20

标签: .net dependency-injection

我正在使用.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

2 个答案:

答案 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());

您只需执行以下步骤:

  • 指出 ServiceCollection 需要获取其他实现的一个类,在我的例子中是“EmailService”。
  • 要有一个约定名称,在我的例子中,在类名称的末尾是“服务”。