结构图配置

时间:2009-01-14 10:03:11

标签: dependency-injection structuremap

考虑以下课程

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 个答案:

答案 0 :(得分:2)

你需要让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。

答案 1 :(得分:0)

如果您希望准确控制您的类将接收的设置对象的实例,您可以通过配置具体类或每个插件来配置其依赖关系来实现此目的。

注意:我正在使用主干,但我相信这里的所有内容都可以在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);
    }
}