12

IOC フレームワークのコンストラクターに引数を渡すにはどうすればよいですか? 私は次のようなことをしたいです:(IOCフレームワークにとらわれないようにしています;))

object objectToLogFor = xxx;
container.Resolve<ILogging>(objectToLogFor); 

public class MyLogging : ILogging
{
    public MyLogging(object objectToLogFor){}
}

これは StructureMap では不可能のようです。しかし、誰かが私が間違っていることを証明するのを見たい.

他のフレームワークはより機能が豊富ですか? それとも IOC フレームワークを間違った方法で使用していますか?

4

7 に答える 7

9

構造マップでは、With メソッドを使用してこれを実現できます。

string objectToLogFor = "PolicyName";
ObjectFactory.With<string>(objectToLogFor).GetInstance<ILogging>();

参照: http://codebetter.com/blogs/jeremy.miller/archive/2008/09/25/using-structuremap-2-5-to-inject-your-entity-objects-into-services.aspx

于 2009-02-21T17:34:38.860 に答える
5

ウィンザー城の場合:

var foo = "foo";
var service = this.container.Resolve<TContract>(new { constructorArg1 = foo });

匿名オブジェクトを使用してコンストラクター引数を指定することに注意してください。

StructureMap を使用:

var foo = "foo";
var service = container.With(foo).GetInstance<TContract>();
于 2009-02-25T14:17:16.197 に答える
4

これはどのように言語に依存しないのでしょうか? これは、問題のフレームワークの実装の詳細です。

Spring では、必要に応じて c'tor args を値/参照のリストとして指定できます。ただし、プロパティ インジェクションと比較すると、あまり読みやすくありません。

一部の人々は、これについて首をかしげ、c'tor インジェクションが Java で唯一のスレッドセーフなアプローチであると主張しています。技術的には正しいですが、実際には問題にならない傾向があります。

于 2008-09-24T19:40:15.567 に答える
3

これはあまり一般的な必要性ではありませんが、有効な場合もあります。StructureMap より軽量なNinjectを使用すると、コンテキストから一時オブジェクトを取得するときにパラメーターを渡すことができます。Spring.NETも。

ほとんどの場合、IoC コンテナーで宣言されたオブジェクトは一時的ではなく、依存関係としてコンストラクター/プロパティ/メソッドを介して他の非一時的なオブジェクトを受け入れます。

ただし、コンテナをファクトリとして使用したくない場合や、解決したいオブジェクトを十分に制御できる場合は、プロパティまたはメソッドの注入を使用できます。

于 2008-09-24T20:00:15.300 に答える
0

ウィンザーでも簡単にできます

于 2009-02-25T14:05:26.847 に答える
0

他の IoC フレームワークは、より機能が豊富です。

つまり、AutofacでParameterResolutionをチェックアウトします。

于 2008-09-30T06:13:44.137 に答える
0

はい、他のフレームワークはより機能が豊富です - コンストラクター注入を可能にする ioc フレームワークを使用する必要があります。Spring は、コンストラクター依存性注入を可能にする多言語 ioc コンテナーの例です。

于 2008-09-24T19:35:08.467 に答える