Mark Seeman получил это право. И я сочувствую твоей неразберихе. Я сам прошел через это, когда научился использовать контейнеры для инъекций с автоматической загрузкой. Проблема в том, что существует много правильных и разумных способов проектирования и использования объектов. Тем не менее, только некоторые из этих подходов работают с контейнерами с инжекцией с автоматической зависимостью.
Моя личная история: Я изучил принципы построения объектов и инверсии управления задолго до того, как узнал, как использовать инверсию контрольных контейнеров, таких как контейнеры Unity или Castle Windsor. Я приобрел привычку писать код так:
public class Foo
{
IService _service;
int _accountNumber;
public Foo(IService service, int accountNumber)
{
_service = service;
_accountNumber = accountNumber;
}
public void SaveAccount()
{
_service.Save(_accountNumber);
}
}
public class Program
{
public static void Main()
{
Foo foo = new Foo(new Service(),1234);
foo.Save();
}
}
В этом проекте, мой класс Foo отвечает за сохранение учетных записей в базе данных. Для этого требуется номер учетной записи, а также служба для выполнения грязной работы. Это несколько похоже на конкретные классы, которые вы указали выше, где каждый объект принимает некоторые уникальные значения в конструкторе. Это отлично работает при создании объектов с помощью собственного кода. Вы можете перейти в соответствующие значения в нужное время.
Однако, когда я узнал об автоматических контейнерах для инъекций, я обнаружил, что я больше не создавал Foo вручную. Контейнер будет создавать экземпляры конструктора для меня. Это было большим удобством для таких сервисов, как IService. Но это, очевидно, не так хорошо работает для целых чисел и строк и т. П. В этих случаях он будет предоставлять значение по умолчанию (например, нуль для целого числа).Вместо этого, я привык к переходящая в конкретном контексте ценностей, как номер счета, имя и т.д ... Так что мне пришлось корректировать свой стиль кодирования и дизайн быть похожим на это:
public class Foo
{
IService _service;
public Foo(IService service)
{
_service = service;
}
public void SaveAccount(int accountNumber)
{
_service.Save(accountNumber);
}
}
public class Program
{
public static void Main()
{
Foo foo = new Foo(new Service());
foo.Save(1234);
}
}
Оказывается, что оба Классы Foo являются действительными проектами. Но второй можно использовать с автоматической инъекцией зависимостей, а первый - нет.
Каким образом можно сохранить их в конфигурационном файле, а не в hardcoding? –