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);

AutoWiring なしでここにある方法では、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 に答える