Как правильно регистрировать зависимости? - "проверьте регистрацию службы с помощью IsRegistered () или используйте метод ResolveOptional () - PullRequest
1 голос
/ 03 июля 2019

Вот мой класс factory, в обязанности которого входит возврат instance на основе типа ввода.

public class ProcessFactory: IProcessFactory
{
    public ProcessFactory(IProcess<ProcessSalaryRequest> processSalaryRequest,
                          IProcess<ProcessLeavesRequest> processLeavesRequest)
    {
         _processSalaryRequest = processSalaryRequest;
         _processLeaveRequest = processLeavesRequest;
    }
}

public IProcess GetInstance(string type)
{
    Type atype;
    if (Enum.TryParse(type, out atype))
    {
        switch (atype)
        {
            case Type.Type1:
                return _processSalaryRequest ;
                break;
            case Type.Type2:
                return _processLeaveRequest ;
                break;
          }
    }
    return null;
 }
}

Это мой интерфейс. Неуниверсальный интерфейс и наследовать от него универсальный интерфейс.

public interface IProcess
{
     void Process(string id);
}
public interface IProcess<T> : IProcess where T : class
{
}

Вот мои регистрации

builder.RegisterType<ProcessSalaryRequest>().As<IProcess<ProcessSalaryRequest>>().SingleInstance();
builder.RegisterType<ProcessLeavesRequest>().As<IProcess<ProcessLeavesRequest>>().SingleInstance();

Теперь, вот регистрация при регистрации factory

  builder.Register(c => new ProcessFactory(c.Resolve<ProcessSalaryRequest>(),c.Resolve<ProcessLeavesRequest>())).As<IProcessFactory>().SingleInstance();

Я получаю ошибку ниже

'MyProject.ProcessSalaryRequest' не был зарегистрирован. Чтобы избежать этого исключения, либо зарегистрируйте компонент для предоставления услуги, проверьте регистрацию службы с помощью IsRegistered (), либо используйте метод ResolveOptional () для разрешения необязательной зависимости. '

Обновление

Вот ProcessSalaryRequest

  public class ProcessSalaryRequest : IProcess<ProcessSalaryRequest>
  {
    private readonly IStatusClient _statusClient;
    public ProcessSalaryRequest(IStatusClient statusClient)
    {
        _statusClient = statusResponseClient;
    }
    void Process(string id)
    {

    }

  }

Диаграмма зависимости

enter image description here

DependencyResolutionException: Обнаружена циклическая зависимость компонента: MyProject.Engine -> MyProject.Broker -> MyProject.ProcessControl -> MyProject.Status -> MyProject.StatusManager -> MyProject.Prcoорес-> MyProject.ProcessSalaryRequest -> MyProject. *

Примечание: Processor получает экземпляр, используя factory, основываясь на некоторых бизнес-условиях.

Ответы [ 2 ]

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

Так как требуемые зависимости интерфейса уже зарегистрированы

builder.RegisterType<ProcessSalaryRequest>().As<IProcess<ProcessSalaryRequest>>().SingleInstance();
builder.RegisterType<ProcessLeavesRequest>().As<IProcess<ProcessLeavesRequest>>().SingleInstance();

, тогда действительно нет необходимости использовать регистрационное выражение.

Просто зарегистрируйте фабрику

builder.RegisterType<ProcessFactory>().As<IProcessFactory>().SingleInstance();

Контейнер должен иметь возможность разрешать необходимые зависимости при разрешении фабрики.

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

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

Судя по коду, представленному в обновлении, проблема возникает при разрешении экземпляров.

Поскольку вы зарегистрировали типы таким образом:

builder.RegisterType<ProcessSalaryRequest>().As<IProcess<ProcessSalaryRequest>>().SingleInstance();
builder.RegisterType<ProcessLeavesRequest>().As<IProcess<ProcessLeavesRequest>>().SingleInstance();

Затем вы должны решить, используя интерфейс, представленный в разделе «Как», например:

builder.Register(c => new ProcessFactory(c.Resolve<IProcess<ProcessSalaryRequest>>(),c.Resolve<IProcess<ProcessLeavesRequest>>())).As<IProcessFactory>().SingleInstance();

В библиотеках IoC (или в большинстве из них) вы разрешаете тип по определенному интерфейсу / базовому типу, зарегистрированному как ссылка.

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