16

コードで StructureMap (バージョン 2.5) の型の既定のコンストラクター (オーバーロードが存在する場合) を定義する方法がわかりません。

サービスのインスタンスを取得したいのですが、コンテナーはそれに Linq2Sql データ コンテキスト インスタンスを挿入する必要があります。

「ブートストラップ」メソッドでこれを書きました:

ForRequestedType<MyDataContext>().TheDefault.Is.OfConcreteType<MyDataContext>();

アプリを実行すると、次のエラーが発生しました。

StructureMap 例外コード: 202
PluginFamily MyNamespace.Data.SqlRepository.MyDataContext、MyNamespace.Data、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null のデフォルト インスタンスが定義されていません

Linq2Sql で生成された不要なコンストラクターをすべてコメントアウトすると、正常に動作します。

[StructureMap.DefaultConstructor]更新:ああ、属性を使用しないことを忘れていました。

4

3 に答える 3

31

ConstructedBy() でコンストラクターを指定できます。これを試してください:

ForRequestedType<MyDataContext>().TheDefault.
Is.ConstructedBy(() => new MyDataContext());

これは私にとってはうまくいきました。

于 2008-11-18T10:35:13.080 に答える
5

Linq2Sql を使用している場合は、オブジェクトの有効期間 (InstanceScope) も設定する必要があると思います。このコードを使用すると、柔軟性が少し向上するため、このコードを使用することをお勧めします。

ForRequestedType< MyDataContext >()
            .CacheBy( InstanceScope.PerRequest )
            .TheDefault.Is.OfConcreteType< MyDataContext >()

SelectConstructor< MyDataContext >( () => new MyDataContext());

このコードを使用すると、次のようにインターフェース定義を MyDataContext コンストラクターにさらに挿入することもできます

SelectConstructor< MyDataContext >( () => new MyDataContext((IDatabaseFactory)null ));

IDatabaseFactory インスタンスの StructureMap で具象型を定義することを忘れないでください。

于 2010-03-13T04:11:05.777 に答える
0

流暢なインターフェース/内部DSLでそれがどのように/できるかどうかはわかりません。ただし、ドメインを汚染することに煩わされていない場合は、属性を使用できますか?

好みのコンストラクターに [DefaultConstructor] でタグ付けします。

于 2008-11-14T09:14:38.393 に答える