Конфигурация XML или Конфигурация через код?

Мне лично нравится опция настроить StructureMap из кода C#. Из того, что я понимаю, одно из преимуществ DI, то, что мы можем легко загрузить новый конкретный экземпляр. Но, если конфигурация определяется в коде, то конкретные экземпляры являются hardcoded в dll.

Так, практически, его столь же хороший как трудно кодировавший зависимости, правильно? Я знаю, во время тестирования его делает жизнь легче...

Моя точка, разве не было бы лучше использовать конфигурацию XML вместо этого? Вы хотите к плагину новый конкретный экземпляр? просто имейте свою перезапись установщика structuremap.config файл с новым.

Так, что предпочтительный путь состоит в том, чтобы настроить StructureMap?

Дополнительный: Am вызвал для использования конфигурации C# в настоящее время, потому что я не знаю, как передать строку подключения экземпляру. Я могу записать connectionstring в файле конфигурации, но я хотел бы снова использовать connectionstring, определенный в app.config.

10
задан alexandrul 19 May 2010 в 09:27
поделиться

2 ответа

Два других «гнусных преступления» против надлежащей практики состоит в том, что удалить метод:

  • перегрузит Map.remove (< K >) , а не переопределит его (так что у вас есть утечка абстракции), и

  • реализует поведение, несовместимое с поведением метода, который он переопределяет!

Установка значения, связанного с ключом, на пустой ряд НЕ СОВПАДАЕТ с удалением записи для ключа. (Даже настройка его в null тонко отличается...)

Это не является нарушением лисковского принципа заменяемости, но это может быть действительно запутанно для того, кто пытается использовать тип. (В зависимости от того, вызван ли метод с помощью типа Map или MyHashMap , можно использовать различные методы с различной семантикой....)

-121--4544588-

Я видел этот метод, написанный несколько раз в проектах, в которых я был, но я должен сказать, что никогда не писал его сам, или назвал его либо... Обычно я нахожу пустые и пустые совершенно разные условия, и у меня нет причин когда-либо объединять их.

-121--2509459-

Независимо от того, какой именно контейнер DI используется, всегда следует отложить разрешение графика объектов приложения до последнего ответственного момента . Это называется корнем композиции приложения .

Можно записать основную часть приложения без ссылки на контейнер DI . Это также означает, что решение между конфигурацией в коде или конфигурации можно отложить до тех пор, пока оно не потребуется.

Вам вообще не нужен контейнер для модульного тестирования , но он может понадобиться для интеграционного тестирования. Однако в интеграционных тестах для контейнера, вероятно, потребуется конфигурация, отличная от конфигурации в окончательном приложении.

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

Конфигурация XML имеет тенденцию быть более хрупкой и слишком подробной. В большинстве случаев она просто замедляет работу, так как не поддерживается рефакторинг или компилятор.

Однако конфигурация XML по-прежнему действительна, когда необходимо иметь возможность замены зависимостей без повторной компиляции приложения. Большинство DI-контейнеров позволяет смешивать эти подходы, чтобы иметь большую часть конфигурации в коде, но несколько выбранных зависимостей, определенных в XML из соображений расширяемости.

17
ответ дан 3 December 2019 в 17:20
поделиться

Чтобы ответить на ваш вопрос, вы можете съесть свой торт и съесть его в 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>
6
ответ дан 3 December 2019 в 17:20
поделиться