Я начну здесь с небольшой предыстории. У нас есть веб-приложение ASP.Net MVC, которое базируется на структуре, примерно основанной на Onion Architecture ] Таким образом, мы имеем следующую (упрощенную) вертикальную структуру:
ПРИМЕЧАНИЕ. Вышеупомянутое упрощено, потому что оно не касается представлений, репозиториев, объектов домена и т. Д., Которые не имеют отношения к этому вопросу.
Для горизонтальной структуры у нас есть некоторые основные области, определяемые тем, что мы называем «Типами элементов» (для простоты этот вопрос будет касаться двух типов элементов: «ItemTypeA», «ItemTypeB» и т. Д.).
У нас есть интерфейс бизнес-службы, который имеет отдельную реализацию для каждого типа элемента:
public interface ISampleBusinessService
{
string SampleMethod(string arg);
}
public class ItemTypeASampleBusinessService : ISampleBusinessService
{
public string SampleMethod(string arg)
{
return "Item Type A: " + arg;
}
}
public class ItemTypeBSampleBusinessService : ISampleBusinessService
{
public string SampleMethod(string arg)
{
return "Item Type B: " + arg;
}
}
Выше - служба приложения, которая использует бизнес-службу:
public interface ISampleAppService
{
string SampleMethod(string arg);
}
public class SampleAppService
{
private readonly ISampleBusinessService service;
public SampleAppService(ISampleBusinessService service)
{
this.service = service
}
public string SampleMethod(string arg)
{
return service.SampleMethod(arg);
}
}
А сверху - наш контроллер, который использует службу приложения:
public class SampleController : Controller
{
private ISampelAppService service
public SampleController(ISampleAppService service)
{
this.service = service;
}
public PartialViewResult SampleAction(string arg)
{
return PartialView( service.SampleMethod(arg) );
}
}
Обратите внимание, что контроллер, интерфейс и реализация службы приложения, и интерфейс бизнес-службы являются общими - им не важно, какой тип элемента используется. Однако реализации бизнес-службы зависят от типа элемента. Мы знаем, с каким типом элементов имеем дело, когда вызываем метод действия на контроллере (через RenderAction в представлениях), но мы не уверены, какой лучший способ определить, какую реализацию бизнес-службы использовать. Мы рассмотрели несколько вариантов:
Какой подход лучше всего подходит для решения этой проблемы? Приветствуются новые варианты. Zac