IoC WinForms
От: Peshuha Россия  
Дата: 25.02.16 19:39
Оценка:
Добрый Всем День!

Есть десктопное приложение, в котором есть классы-FormBased (рабочие формы). Сейчас отделили поставщика данных от локального сервера и с помощью интерфейсов вывели поставку чз веб. Это ура,НО! Сейчас это выглядит примерно так :

public class WorkForm
       inherits Form

       public Sub Something()

            using iThisRepo as IThisRepository = DIContainer.Resolve(Of IThisRepository)()
        ' using iThisRepo ...
            end using
       end sub


end class


А хотелось бы
public class WorkForm
       inherits Form

    private m_iThisRepo as IThisRepository 
    
    public sub New(iThisRepo as IThisRepository)
        m_iThisRepo = iThisRepo
    end sub

    public Sub Something()
        ' using iThisRepo ...
    end sub


end class


Как это сделать в принципе понятно. Создаем процедуру старта, подкатываем контейнер зависимостей,тра-ля-ля...
Вопрос в том, что если с именно с интерфейсами у этой формы все ясно, то как инициализировать те интерфейсы, которые подтянутся с котролов и диалогов, которыми эта форма будет пользоваться.

На текущий момент у меня такие варианты:

1) Тащим их всех на конструктор формы
public class WorkForm
       inherits Form

    private m_iThisRepo as IThisRepository 
    private m_iForContol1_1 as IForControl1_1
    private m_iForContol1_2 as IForControl1_2
    private m_iForDialog1_1 as IForDialog1_1
    private m_iForDialog1_2 as IForDialog1_2
    ...
    
    public sub New(
            iThisRepo as IThisRepository, _
            iForContol1_1 as IForControl1_1, _
            iForContol1_2 as IForControl1_2, _
            iForDialog1_1 as IForDialog1_1, _
            iForDialog1_2 as IForDialog1_2, _
            ...
        )
        m_iThisRepo = iThisRepo
        m_iForContol1_1 = iForContol1_1
        m_iForContol1_2 = iForContol1_2
        m_iForDialog1_1 = iForDialog1_1
        m_iForDialog1_2 = iForDialog1_2
        ...
        
        ComponentInitialize()

        m_control1.Init(m_iForContol1_1, m_iForContol1_2)
    end sub

    public Sub Something2()
        
        using d as new MyDialog1(m_iForDialog1_1, m_iForDialog1_2)
            ...
        end using
    end sub


end class


плюс — очевидность с чем форма собирается работать
минус — нужно вытаскивать все интерфейсы на "поверхность" этой "стартовой" формы


2) Оставляем как есть, используя местное
        ' где-то в недрах MyDialog1   
    using iRepoForDialog1 as IRepositoryForDialog1 = DIContainer.Resolve(Of IRepositoryForDialog1)()
        ' using iRepoForDialog1 ...
    end using


плюс — работает
минус — неконтролируемая реализация интерфейсов


3) Есть вариант взглянуть на решение под другим углом:
public class WorkForm
       inherits Form

    private m_iThisRepo as IThisRepository 
    private m_iContol1 as IControl1
    private m_iDialog1 as IDialog1
    ...
    
    public sub New(
            iThisRepo as IThisRepository, _
            iContol1 as IControl1, _
            iDialog1 as IDialog1, _
            ...
        )
        m_iThisRepo = iThisRepo
        m_iContol1 = iContol1
        m_iDialog1 = iForDialog1
        ...
        
        ComponentInitialize()

        ' -->> Тогда как проинициализировать контрол используя генератор не понимаю <<--
    end sub

    public Sub Something2()
        
        ' -->> Здесь все просто <<--
        m_iDialog1.Something(...)
    end sub


end class



Заранее спасибо,Илья
ПС: если велосипед — сильно не пинать
... Мы не привыкли отступать! И расколоть его поможет киножурнал "Хочу Все Знать"! ;)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.