Как добавить несколько реализаций интерфейса через внедрение зависимостей, не добавляя их по одному - PullRequest
0 голосов
/ 02 мая 2019

Я использую ядро ​​.net, Я получил простой интерфейс что-то вроде:

public interface ITask
{
    string TaskName { get; }
    void Execute(TaskDetails item);
}

У меня есть много классов, которые реализуют это, пример класса:

public class Task1Adapter : ITaskAdapter
{

    public string TaskName => "MyTask...";

    public void Execute(TaskDetails item)
    {
         var x = 1 + 1;
    } 
}

Затем я получил раздел DI, в котором я добавляю строку для каждого класса -

services.AddSingleton<ITaskAdapter, Task1Adapter>();

Моя проблема в том, что я получил довольно много заданий и, если возможно, я бы предпочел не иметь более 100 строк AddSingleton.

Есть ли способ как-то добавить все классы, которые реализуют этот интерфейс за один раз, без необходимости добавлять AddSingleton логику для каждого нового класса, который я добавляю?

Edit: Поскольку мне нужно вызывать разные задачи / классы, которые динамически реализуют интерфейс, я использовал следующую логику во время выполнения -

private readonly IEnumerable<IFilesWorkerAdapter> _taskAdapter;
_taskAdapter.FirstOrDefault(e => e.TaskName== taskNameFromExternalSource).Execute();

1 Ответ

1 голос
/ 02 мая 2019

Вы можете использовать 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/

Надеюсь, это поможет вам. С уважением, Джон 1014 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...