Инъекция зависимостей - строительство - PullRequest
2 голосов
/ 17 января 2012

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

Примечание: эти службы хранятся в моей основной библиотеке, а не в моем веб-приложении (asp.net mvc)

// IUserSession никогда не известно, этозависит от клиентского приложения, это никогда не известно, поэтому я должен внедрить все время

// IWorkflowService Мне нужно внедрить, так как клиентское приложение имеет несколько различных сервисов / пакетов, в зависимости от того, чтобизнес-правила могут отличаться

// IReadonlySession только 1 в моем приложении, поэтому мне никогда не нужно вводить?может отличаться в других клиентских вызовах, но маловероятно, что

// INotificationService всегда будет тем, что я говорю, это всегда будет одной вещью, поэтому я должен программировать с интерфейсома не внедрять?

private readonly IUserSession _userSession;
private readonly IReadOnlySession _readonlySession;
private readonly INotificationService _notificationService;

public Processor(IUserSession userSession, IWorkflowService workflowService)
        : base(workflowService)
    {
        _userSession = userSession;
        _readonlySession = new ReadonlySession();
        _notificationService = new NotificationService();
    }

// IReadonlySession внедряется, поскольку это может измениться в зависимости от того, выполняю ли я тесты, могу ли я использовать другую базу данных или я могу вызвать свой кодиз другого клиентского приложения (маловероятно, но возможно)

public Processor(IUserSession userSession, IWorkflowService workflowService,   IReadonlySession readonlySession)
        : base(workflowService)
    {
        _userSession = userSession;
        _readonlySession = readonlySession;
        _notificationService = new NotificationService();
    }

Вопрос:

Правильно ли выполнено создание объектов?Правильно ли я это реализовал?

1 Ответ

3 голосов
/ 17 января 2012

При программировании на интерфейсе мало что получится, если у вас все еще есть жесткая связь с NotificationService, поэтому я бы сказал,

  • либо inject INotificationService
  • или программа против конкретного класса

Поскольку, по-видимому, существуют некоторые подходящие значения по умолчанию, вам следует рассмотреть Конструкторное построение цепочек :

public Processor(IUserSession userSession, IWorkflowService workflowService)
    : this(userSession, workflowService, new ReadonlySession()) { }

public Processor(IUserSession userSession,
    IWorkflowService workflowService, IReadonlySession readonlySession)
    : base(workflowService)
{
    _userSession = userSession;
    _readonlySession = readonlySession;
    _notificationService = new NotificationService();
}

Это позволит потребителю вашей библиотеки легко начать работу, не ограничивая опытных пользователей.

Возможно, вы также захотите использовать решение Facade, описанное здесь: Библиотека дружественных зависимостей (DI)

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