Выбор реализации сервиса на основе бизнес-правил
В приложении, над которым я работаю, у нас есть действия, которые запускаются при добавлении новой сущности в хранилище. Предполагается, что одно из новых действий будет использовать службу (например, уровень службы, а не веб-службу где-то в эфире) для выполнения некоторых манипуляций бизнес-правил при входе объекта.
Это все хорошо, но точная услуга, которая должна использоваться, будет варьироваться в зависимости от свойств объекта, которым мы манипулируем (в основном, в зависимости от того, к какому клиенту относится объект). Я хотел бы, чтобы действие было тесно связано со вкусом обслуживания, которое может потребоваться вызвать.
Я думаю о том, чтобы реализовать фабрику, которая будет принимать сущность и возвращать правильное обслуживание. Это кажется немного глупым, хотя. Есть ли лучший способ настроить это?
Я рассмотрел использование контейнера IoC для определения правильной реализации во время выполнения, но быстрое изучение пары (Ninject и Windsor), похоже, не указывает на то, что они хорошо подходят для такого рода операций.
3 ответа
Я думаю, что для этой итерации мы будем сохранять ее простотой и использовать фабрику для выбора правильного интерфейса (то есть решение, которое я считал "грязным" в оригинальном посте). Спасибо всем за отзывы!
Вы подходите к этому неправильно. Вы должны использовать события для этого:
// your repository event
public class ItemCreated<T>
{
}
Обработчики:
public class DoSomething : ISubscribeOn<ItemCreated<User>>
{
public class DoSomething(ISomeService)
{}
}
Обратите внимание, что не сам сервис, а посредник подписывается на событие. Это делает вещи менее разъединенными.
Все это встроено в мой контейнер IoC: http://www.codeproject.com/Articles/440665/Having-fun-with-Griffin-Container
Прокрутите вниз до событий домена.
Я бы порекомендовал вам внимательно взглянуть на MEF (Managed Extensibility Framework). Это обеспечивает очень независимую слабую связь, которая близко (если не точно) соответствует вашим требованиям.