Конфигурация структуры карты - PullRequest
0 голосов
/ 14 января 2009

Рассмотрим следующий класс

public class SchemaExecutor: ISchemaExecutor
{
    public SchemaExecutor(SqlPlusSettings sqlPlusSettings)
    {
        _sqlPlusSettings = sqlPlusSettings;
    }
...

И конфигурация контейнера

ObjectFactory.Initialize( x =>
{
    SqlPlusSettings sqlPlusSettings = GetSqlPlusSettings();
    x.ForRequestedType<ISchemaExecutor>().TheDefaultIsConcreteType<SchemaExecutor>()
        .WithCtorArg("sqlPlusSettings").EqualT(sqlPlusSettings);                       
 });

Но .WithCtorArg работает только для примитивов, поэтому приведенная выше инициализация не работает.

Есть ли способ настроить конструктор с не примитивным параметром?

Ответы [ 2 ]

2 голосов
/ 20 января 2009

Вам нужно просто позволить IoC делать то, что он делает, и вводить ваши зависимости для вас ...

ObjectFactory.Initialize( x =>
 {
      x.ForRequestedType<SqlPlusSettings>().TheDefaultIsConcreteType<SqlPlusSettings>().AsSingletons;
      x.ForRequestedType<ISchemaExecutor>().TheDefaultIsConcreteType<SchemaExecutor>();
 });

SqlPlusSettings sqlPlusSettings = GetSqlPlusSettings();
ObjectFactory.Inject<SqlPlusSettings>(sqlPlusSettings);

То, как у вас это происходит здесь без AutoWiring, я думаю, что избыточная строка для SqlPlusSettings необходима для того, чтобы StructureMap знал об этом. Но по сути SM знает как о SchemaExecutor, так и о SqlPlusSettings, и при создании экземпляра SchemaExecutor он ищет параметры, видит, что SqlPlusSettings является одиночным, и он уже есть, и передает его для создания экземпляра SchemaExecutor.

0 голосов
/ 15 декабря 2009

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

Примечание: я использую транк, но я полагаю, что здесь все доступно в 2.5.3.

public class MySettings
{

}

public interface IMyClass
{
    MySettings Settings { get; }
}

public class MyClass : IMyClass
{
    public MySettings Settings { get; private set; }

    public MyClass(MySettings settings)
    {
        Settings = settings;
    }
}

[TestFixture]
public class registry_test
{
    [Test]
    public void configure_concrete_class()
    {
        var mySettings = new MySettings();

        var container = new Container(config =>
        {
            config.For<MySettings>().Use(mySettings);
            config.For<IMyClass>().TheDefaultIsConcreteType<MyClass>();
        });

        container.GetInstance<IMyClass>().Settings.ShouldBeTheSameAs(mySettings);
    }

    [Test]
    public void configure_concrete_ctor_dependency()
    {
        var mySettings = new MySettings();

        var container = new Container(config =>
        {
            config.For<IMyClass>().TheDefault.Is.OfConcreteType<MyClass>()
                .CtorDependency<MySettings>().Is(mySettings);
        });

        container.GetInstance<IMyClass>().Settings.ShouldBeTheSameAs(mySettings);
    }
}
...