Есть ли способ ввести зависимость от вспомогательного класса с помощью контейнера IoC? - PullRequest
2 голосов
/ 10 июля 2019

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

Это потому, что этот вспомогательный класс реализует интерфейси другие классы, которые реализуют это, не обязательно должны принимать это в этом конкретном методе.

Я пытаюсь решить эту проблему без изменения большого количества кода.

public class SomeService : Service
{
    public IRepository Repo { get; set; }
    public object Get(Request req)
    {
        var helper = new SomeServiceHelper();
        var somethingFromHelper = helper.GetSomething();

        var SomethingFromRepo = Repo.GetSomethingElse();

        .
        .
        .
    }

    public object Post(Request req)
    {
        Repo.SaveSomething(something);
    }
}

public class SomeServiceHelper : IHelper
{
    public IRepository Repo { get; set; }
    public object GetSomething()
    {
        Repo.GetSomethingFromDB();

        .
        .
        .
    }
}

Ответы [ 2 ]

3 голосов
/ 10 июля 2019

Если сам класс SomeService нуждается в репозитории только для того, чтобы создать помощника (что в вашем примере не показано, кстати), самым простым решением было бы изменить класс, чтобы внедрить помощника.

public class SomeService : Service
{
    private IHelper helper;

    public SomeService(IHelper helper)
    {
        this.helper = helper;
    }

    public object Get(Request req)
    {
        var somethingFromHelper = helper.GetSomething();
        // ... etc ...
    }
}

А затем в вспомогательной реализации обновите его, чтобы в него был добавлен репозиторий:

public class SomeHelper : IHelper
{
    private IRepository repo;

    public SomeHelper(IRepository repo)
    {
        this.repo = repo;
    }

    public object GetSomething()
    {
        repo.GetSomethingFromDB();
        // ... etc ...
    }
}

Этот процесс использует преимущества любого используемого вами DI-контейнера и ограничивает зависимости конкретно для классаиспользует.И избавляется от посторонних публичных свойств при загрузке, что тоже хорошо.

1 голос
/ 10 июля 2019

Это потому, что этот вспомогательный класс реализует интерфейс, и другие классы, которые его реализуют, могут не обязательно использовать это в этом конкретном методе.

Вам не нужнозарегистрируйте свой класс помощника в интерфейсе, вы можете просто зарегистрировать конкретный тип, например:

container.RegisterAutoWired<SomeServiceHelper>();

или:

container.Register(c => new SomeServiceHelper {
    Repo = c.Resolve<IRepository>(),
});

Тогда вы могли бы ввести одно или оба в свою службу:

public class SomeService : Service
{
    public SomeServiceHelper Helper { get; set; }
    public IRepository Repo { get; set; }
}
...