Если вам нужны дополнительные зависимости в ваших сущностях, не используйте инжектор конструктора.Вместо этого создайте дополнительный параметр в методе объекта.
Теперь вы спросите себя, как вы получаете зависимость.Для этого вы можете использовать CommandHandlers и Commands.Обработчик команды принимает зависимость в своем конструкторе и вызывает метод объекта.В пользовательском интерфейсе вы создаете командное сообщение и отправляете его командному процессору, который отвечает за вызов правильного обработчика команд.
Я надеюсь, что мое объяснение для вас приемлемо.
Домен:
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public void SendNotification(string message, INotifier notifier)
{
notifier.SendMessage(string.Format("Message for customer '{0}' ({1}): {2}", Name, Id, message));
}
}
Компонент инфраструктуры INotifier
передается через метод, а не через конструктор!
Инфраструктура:
public interface INotifier
{
void SendMessage(string message);
}
class EmailNotifier : INotifier
{
public void SendMessage(string message)
{
// SmtpClient...
}
}
class SMSNotifier : INotifier
{
public void SendMessage(string message)
{
// SMS ...
}
}
Command и CommandHandler:
public class NotificationCommandHandler : ICommandHandler<NotificationCommand>
{
private readonly INotifier _notifier;
public NotificationCommandHandler(INotifier notifier)
{
_notifier = notifier;
}
public void Execute(NotificationCommand commandMessage)
{
commandMessage.Employee.SendNotification(commandMessage.Message, _notifier);
}
}
public class NotificationCommand
{
public string Message { get; set; }
public Employee Employee { get; set; }
}
CommandHandler получает INotifier посредством внедрения конструктора.Таким образом, вам не нужно использовать ваш IoC-контейнер как ServiceLocator.
Использование, т. Е. В пользовательском интерфейсе контроллера:
public class Controller
{
private readonly IMessageProcessor _messageProcessor;
public Controller(IMessageProcessor messageProcessor)
{
_messageProcessor = messageProcessor;
}
public void SendNotification (Employee employee, string message)
{
var sendMailCommand = new NotificationCommand
{
Employee = employee,
Message = message
};
_messageProcessor.Process(sendMailCommand);
}
}
Если у вас есть вопросы о командном процессоре, посмотрите проект mvccontrib или задайте отдельный вопрос..