Это типичный вариант использования для МОК?
Мое текущее приложение позволяет пользователям определять пользовательские веб-формы через набор экранов администратора. Это'По сути, приложение типа EAV. Таким образом, я могуТвердый код HTML или ASP.NET разметки для отображения данной страницы. Вместо этого пользовательский интерфейс запрашивает экземпляр объекта Form из сервисного уровня, который, в свою очередь, создает его, используя несколько таблиц RDMBS. Форма содержит классы, которые вы ожидаете увидеть в таком контексте: =>Form
=>IEnumerable
IEnumerable
Вот'Как выглядит сервисный уровень:
public class MyFormService: IFormService{
public Form OpenForm(int formId){
//construct and return a concrete implementation of Form
}
}
Все работает великолепно (на время). Пользовательский интерфейс не является мудрым в отношении того, какие разделы / поля существуют в данной форме: он с радостью выводит объект формы, который он получает, на функциональную страницу ASP.NET.
Несколько недель спустя я получил новое требование от бизнеса: при просмотре нередактируемых (то есть только для чтения) версий формы определенные значения полей должны быть объединены вместе, и должны быть добавлены другие надуманные / вычисленные поля. Нет проблем, я говорю. Просто измените мой класс обслуживания так, чтобы его методы были более явными:
public class MyFormService: IFormService{
public Form OpenFormForEditing(int formId){
//construct and return a concrete implementation of Form
}
public Form OpenFormForViewing(int formId){
//construct and a concrete implementation of Form
//apply additional transformations to the form
}
}
Снова все работает отлично, и баланс был восстановлен в силе. Пользовательский интерфейс продолжает быть независимым от того, что находится в Форме, и наше разделение интересов достигнуто. Однако всего через несколько недель бизнес выдвигает новое требование: в определенных случаях мы должны применять тольконемного преобразований формы, на которые я ссылался выше.
На данный момент, это похоже на "явный метод " подход зашел в тупик, если я не захочу закончить взрывом методов (OpenFormViewingScenario1, OpenFormViewingScenario2 и т. д.). Вместо этого я ввожу другой уровень косвенности:
public interface IFormViewCreator{
void CreateView(Form form);
}
public class MyFormService: IFormService{
public Form OpenFormForEditing(int formId){
//construct and return a concrete implementation of Form
}
public Form OpenFormForViewing(int formId, IFormViewCreator formViewCreator){
//construct a concrete implementation of Form
//apply transformations to the dynamic field list
return formViewCreator.CreateView(form);
}
}
На первый взгляд это кажется приемлемым подходом, и все же есть определенный запах. А именно, пользовательский интерфейс, который жил в невежественном блаженстве по поводу деталей реализации OpenFormForViewing, должен обладать знаниями и создавать экземпляр IFormViewCreator.
У меня двоякие вопросы: есть ли лучший способ добиться компостируемости?м после? (возможно, с помощью контейнера IoC или домашнего проката для создания конкретного IFormViewCreator)?Я фундаментально испортил абстракцию здесь?