2014-12-01 2 views
2

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

public class FormBase : Form 
{ 
    #region Properties 

    public BusinessLogic.ChppManager ChppManager { get; protected set; } 
    public BusinessLogic.DatabaseManager DatabaseManager { get; protected set; } 
    public BusinessLogic.FileManager FileManager { get; protected set; } 
    public BusinessLogic.RegistryManager RegistryManager { get; protected set; } 

    #endregion Properties 
} 

И передаю каждый из этих объектов на конструкторе. Он работает, но я хотел знать, есть ли более простой (стандартный) способ сделать это, не передавая эти параметры при каждом вызове конструктора.

Заранее спасибо.

ответ

1

Если вы используете инъекции зависимостей контейнера, как Unity использовать разрешение конструктора параметров конструктора, вы бы загрузить инициализируются объекты в контейнер Unity, а затем использовать метод Resolve<T>() для разрешения зависимостей во время выполнения означает, что вы не имеете чтобы указать их в качестве параметров в вашем коде, однако они все равно должны быть частью подписи конструктора.

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

+0

В дополнение к вашему ответу, я думаю, стоит упомянуть, что другие контейнеры IoC, такие как Castle Windsor, позволяют вам вводить зависимости, используя такие свойства, как OP. Это не требовало бы, чтобы они были частью подписи ctor. – nozzleman

+0

ОК, я посмотрю на Unity. Благодарю. – hyperar

+1

Unity также выполняет впрыск свойств. Тем не менее, вы заметите, что он назначил своих сеттеров частным лицам, поэтому я предполагаю, что он не хочет допускать случайную перезапись этих ссылок, и в этом случае встраивание конструкции - это путь вперед. – toadflakz

0

Рекомендуемый способ: не сделать это. Такой базовый класс с этими зависимостями является запахом кода, потому что вы скрываете тот факт, что в реализациях форм используется слишком много зависимостей, что является признаком нарушения принципа единой ответственности. Нарушения SRP часто приводят к более сложному пониманию, трудно поддерживать код.

Вместо этого следует избегать использования базового класса, который использует эти зависимости по умолчанию. Если класс должен использовать некоторую службу, вставьте ее в конструктор. Если для класса требуется слишком много зависимостей, это указывает на нарушение SRP, и вы должны исследовать и рефакторировать; например, aggregate services.

Смежные вопросы