0

考虑下面的类

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仅适用于原语,因此上面的初始化不起作用。

有没有办法用非原始参数配置构造函数?

4

2 回答 2

2

你只需要让 IoC 做它所做的事情并为你注入你的依赖项......

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

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

你在这里没有自动装配的方式,我认为 SqlPlusSettings 的冗余行需要让 StructureMap 知道它。但本质上,SM 知道 SchemaExecutor 和 SqlPlusSettings,当实例化 SchemaExecutor 时,它会查找参数,看到 SqlPlusSettings 是一个单例,它已经有一个,并将它传递给实例化 SchemaExecutor。

于 2009-01-20T06:08:40.980 回答
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);
    }
}
于 2009-12-14T23:11:53.510 回答