Мне лично нравится опция настроить StructureMap из кода C#. Из того, что я понимаю, одно из преимуществ DI, то, что мы можем легко загрузить новый конкретный экземпляр. Но, если конфигурация определяется в коде, то конкретные экземпляры являются hardcoded в dll.
Так, практически, его столь же хороший как трудно кодировавший зависимости, правильно? Я знаю, во время тестирования его делает жизнь легче...
Моя точка, разве не было бы лучше использовать конфигурацию XML вместо этого? Вы хотите к плагину новый конкретный экземпляр? просто имейте свою перезапись установщика structuremap.config файл с новым.
Так, что предпочтительный путь состоит в том, чтобы настроить StructureMap?
Дополнительный: Am вызвал для использования конфигурации C# в настоящее время, потому что я не знаю, как передать строку подключения экземпляру. Я могу записать connectionstring в файле конфигурации, но я хотел бы снова использовать connectionstring, определенный в app.config.
Два других «гнусных преступления» против надлежащей практики состоит в том, что удалить
метод:
перегрузит Map.remove (< K >)
, а не переопределит его (так что у вас есть утечка абстракции), и
реализует поведение, несовместимое с поведением метода, который он переопределяет!
Установка значения, связанного с ключом, на пустой ряд НЕ СОВПАДАЕТ с удалением записи для ключа. (Даже настройка его в null
тонко отличается...)
Это не является нарушением лисковского принципа заменяемости, но это может быть действительно запутанно для того, кто пытается использовать тип. (В зависимости от того, вызван ли метод с помощью типа Map
или MyHashMap
, можно использовать различные методы с различной семантикой....)
Я видел этот метод, написанный несколько раз в проектах, в которых я был, но я должен сказать, что никогда не писал его сам, или назвал его либо... Обычно я нахожу пустые и пустые совершенно разные условия, и у меня нет причин когда-либо объединять их.
-121--2509459-Независимо от того, какой именно контейнер DI используется, всегда следует отложить разрешение графика объектов приложения до последнего ответственного момента . Это называется корнем композиции приложения .
Можно записать основную часть приложения без ссылки на контейнер DI . Это также означает, что решение между конфигурацией в коде или конфигурации можно отложить до тех пор, пока оно не потребуется.
Вам вообще не нужен контейнер для модульного тестирования , но он может понадобиться для интеграционного тестирования. Однако в интеграционных тестах для контейнера, вероятно, потребуется конфигурация, отличная от конфигурации в окончательном приложении.
В целом, настройка контейнера в коде является предпочтительным подходом в настоящее время, потому что он более надежен и вы можете применять основанную на соглашении механику конфигурации.
Конфигурация XML имеет тенденцию быть более хрупкой и слишком подробной. В большинстве случаев она просто замедляет работу, так как не поддерживается рефакторинг или компилятор.
Однако конфигурация XML по-прежнему действительна, когда необходимо иметь возможность замены зависимостей без повторной компиляции приложения. Большинство DI-контейнеров позволяет смешивать эти подходы, чтобы иметь большую часть конфигурации в коде, но несколько выбранных зависимостей, определенных в XML из соображений расширяемости.
Чтобы ответить на ваш вопрос, вы можете съесть свой торт и съесть его в StructureMap. Вы можете настроить свой контейнер из кода и добавить этот дополнительный бит конфигурации, который вам нужен, из конфигурации приложения. Для этого и предназначен EqualToAppSetting .
Создайте класс настроек
public class DatabaseSettings
{
public DatabaseSettings(string type, string connectionString)
{
Type = type;
ConnectionString = connectionString;
}
public string Type { get; set; }
public string ConnectionString { get; set; }
}
Затем скажите StructureMap настроить его, используя настройки вашего приложения.
[Test]
public void setup_concrete_class_via_application_configuration()
{
var container = new Container(config =>
{
config.ForConcreteType<DatabaseSettings>().Configure
.Ctor<string>("type").EqualToAppSetting("dovetail.database.type", "mssql")
.Ctor<string>("connectionString").EqualToAppSetting("dovetail.database.connectionString");
});
var databaseSettings = container.GetInstance<DatabaseSettings>();
databaseSettings.Type.ShouldEqual("mssql");
databaseSettings.ConnectionString.ShouldEqual("Data Source=.; Initial Catalog=dovetail;User Id=sa;Password=sa;");
}
Наконец, вот как настройки приложения выглядят в моей конфигурации приложения:
<appSettings>
<add key="dovetail.database.type" value="mssql"/>
<add key="dovetail.database.connectionString" value="Data Source=.;Initial Catalog=dovetail;User Id=sa;Password=sa;"/>
</appSettings>