0

構造マップを使用して、このようなコンストラクターのインジェクションを解決します

public class MyClass
{
    private readonly IDependency _dependency;

    public MyClass(IDependency dependency)
    {
        _dependency = dependency;
    }
// my methods
}

そして、私はいくつかのクラス Dependency を持っています: IDependency

そしてStructureMap構成で私は持っています

public static IContainer Initialize()
        {
            ObjectFactory.Initialize(x =>
            {
                x.For<IDependency>().Use<Dependency>();
            });
            return ObjectFactory.Container;
        }

すべてが正常に機能します

しかし、他のコントローラーでは、メソッドインジェクションを行う必要があります

public ActionResult(IDependency dependency)
{
    dependency.DoSomething();
}

そして、依存変数に Dependency クラスを入れたい

4

2 に答える 2

0

通常、コンストラクター (またはセッター) に IDependency を注入し、メソッドで使用できるプライベート クラス メンバーに割り当てます。

private readonly IDependency _dependency;

public MyClass(IDependency dep)
{
    this._dependency = dep;
}

public ActionResult MyAction()
{
    _dependency.DoSomething();
}
于 2012-06-21T17:05:11.423 に答える
0

@daveあなたの答えに同意しますが、MyClassはStructureMapのShared/Singletonスコープに登録されていると考えてください。この場合、dep を MyClass に挿入すると、アプリケーションの存続期間中、dep オブジェクトへの参照を保持していることを意味します。私にはメモリドレインのように聞こえます。

私は最近同じ状況に陥り、StructureMapのIContainerを(他のすべてのナンセンスオブジェクトの代わりに)コンストラクターに注入することを確定し、それを使用して必要に応じてオブジェクトを取得しました。

private readonly IContainer _container;

public MyClass(IContainer con)
{
    this._container = con;
}

public ActionResult MyAction()
{
    var _dependency = _container.GetInstance<IDependency> ();
    _dependency.DoSomething();
}

このようにして、注入されたオブジェクトのスコープが MyAction() メソッドになり、GC で使用できるようになります。

于 2013-10-18T11:18:59.143 に答える