Как правило, в структурах внедрения зависимостей используются атрибуты и отражение, чтобы определить, какие поля, свойства и методы класса требуют внедрения зависимостей во время создания, а затем использовать отражение для фактического внедрения зависимостей, что позволяет обойти обычные ограничения доступа. например, ввод в частные поля.
Теперь, ваш пример кажется мне неправильным. Атрибут находится в свойстве только для чтения, которое не может быть установлено отражением или любым другим способом. Я ожидаю, что ваш пример будет выглядеть так:
[RootWorkItem(Inject = true)]
private RootWorkItem m_RootWorkItem;
public RootWorkItem RootWorkItem {
get {
if (m_RootWorkItem == null) {
m_RootWorkItem = new RootWorkItem();
}
return m_RootWorkItem;
}
}
Возможно ли, что ваше замешательство связано с размещением атрибута?
Кроме того, поскольку вы вводите значение m_RootWorkItem
в поле, вам больше не понадобится охрана на вашей собственности.
[RootWorkItem(Inject = true)]
private RootWorkItem m_RootWorkItem;
public RootWorkItem RootWorkItem {
get {
return m_RootWorkItem;
}
}
Таким образом, вы можете пойти еще дальше и использовать автоматически реализованное свойство:
[RootWorkItem(Inject = true)]
public RootWorkItem RootWorkItem { get; private set; }
Наконец, я не уверен, почему тип атрибута совпадает с типом свойства и именем. Тогда я бы ожидал чего-то большего:
[Inject(true)]
public RootWorkItem RootWorkItem { get; private set; }
Я не знаю, какую платформу вы используете, поэтому я не могу комментировать, что делает параметр true
, поэтому я включил его дословно.
отредактировано в связи с редактируемым вопросом
Вам не хватает понятия, что структура внедрения зависимостей также является абстрактной фабрикой.
Таким образом, вы не будете напрямую создавать экземпляр MyForm
. Вместо этого вы должны каким-то образом зарегистрировать в своем DI-контейнере тип MyForm
, а затем использовать контейнер для создания экземпляров для вас. Затем он создаст экземпляр, но перед возвратом вам он внедрит зависимости (которые он обнаруживает посредством отражения в атрибутах).
Например:
// configure at start-up
container.Register<MyForm>();
// some point later in your code
MyForm mf = container.Resolve<MyForm>();