2015-10-02 4 views
1

Я использую шаблон MVP, чтобы вывести значения полей из моего представления в мой презентатор. Я хотел бы добавить ErrorProvider в мой просмотр и добавить ошибки из Presenter, но это означало бы разоблачение моих элементов управления, которые я не собираюсь делать. Мое решение включало создание класса ExposableControlValue, который предоставляет общее значение и имеет добавленную функцию CreateError(string errorMessage).MVP ErrorControl Свойство

public interface IExposableControlValue<T> 
{ 

    T Value { get; set; } 

    void CreateError(string errorMessage); 

    void ClearErrors(); 

} 

Моя мысль была, я пройду в Property по ссылке, и теперь мое общее значение будет по существу указывают на основы поля Control «s. Вся логика ErrorProvider может обрабатываться. Сторона просмотра и вся проверка ошибок могут обрабатываться ведущим.

Очевидно, что я здесь, потому что вы не можете передать Property по ссылке, и все примеры, которые я видел, не настолько близки к моей ситуации, что я могу их расшифровать для этого примера.

Я бы тоже был настроен с настройками T Get(), Set(T value) динамически, если есть способ сделать это, но, короче говоря, я хотел бы подражать тому, что Property 'live' внутри моего экземпляра класса.

ответ

0

Я отвечу на свой вопрос, поскольку, наконец, я смог выполнить это с учетом моих желаемых потребностей.

Используя шаблон фабрики, я был в состоянии сделать новый метод CreateNew

public IExposableControlValue<T> CreateNew<T>(ErrorProvider errorProvider, Control control, Func<T> get, Action<T> set) { 
    var param1 = new ConstructorArgument("errorControl", errorProvider); 
    var param2 = new ConstructorArgument("control", control); 
    var exposableControlValue = resolutionRoot.Get<IExposableControlValue<T>>(param1, param2); 
    exposableControlValue.CreateSet(set); 
    exposableControlValue.CreateGet(get); 

    return exposableControlValue; 
    } 

Я использую ninject, но концепция та же. По сути, я прошу у пользователя нескольких зависимостей создать новый экземпляр этого класса. Затем, когда я хочу, чтобы на самом деле раскрыть внутреннюю Generic значения, я делаю это так:

Func<T> get; 

    Action<T> set; 

    public ExposableControlValue(ErrorProvider errorControl, Control control) { 
    ...configure my dependcies 
    } 

    public T Value { get { return get.Invoke(); } set { set.Invoke(value); } } 

Наконец, когда я использую метод фабрики CreateNew, я прохожу в некоторых аргументах в зависимости от свойства, что мне нужно

_forSomethingBackingField = exposableControlFactory.CreateNew<decimal>(errorProvider, numericUpDownForSomething, 
     () => { return numericUpDownForSomething.Value; }, (decimal d) => { numericUpDownForSomething.Value = d; }); 

decimal является моим общим значением для numeric up down. Если вы хотите сделать это с помощью string, вы просто должны использовать string в качестве общего аргумента и передать (string s) = > someControlWithTextProperty.Text = s параметру анонимного метода. Конечно, делая это, вы должны убедиться, что свойство, которое вы используете, фактически относится к типу, который вы передаете.