Это типичный вариант использования для МОК?

Мое текущее приложение позволяет пользователям определять пользовательские веб-формы через набор экранов администратора. Это'По сути, приложение типа EAV. Таким образом, я могуТвердый код HTML или ASP.NET разметки для отображения данной страницы. Вместо этого пользовательский интерфейс запрашивает экземпляр объекта Form из сервисного уровня, который, в свою очередь, создает его, используя несколько таблиц RDMBS. Форма содержит классы, которые вы ожидаете увидеть в таком контексте: =>Form =>IEnumerableIEnumerable

Вот'Как выглядит сервисный уровень:

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)?Я фундаментально испортил абстракцию здесь?

Ответы на вопрос(2)

Ваш ответ на вопрос