私は、単一メソッドのインターフェイスの代わりに名前付きのデリゲートを使用して実験してきました。Castle Windsorに静的クロージャを登録する簡単な方法はありますか?
public interface IProductSource
{
IEnumerable<Product> GetProducts();
}
public class DataContextProductSource : IProductSource
{
private readonly DataContext _DataContext;
public DataContextProductSource(DataContext dataContext)
{
if (dataContext == null) throw new ArgumentNullException("dataContext");
_DataContext = dataContext;
}
public IEnumerable<Product> GetProducts()
{
return _DataContext.Products.AsEnumerable();
}
}
へ:
public delegate IEnumerable<Product> DGetProducts();
public static class DataContextFunctions
{
public DGetProducts GetProducts(DataContext dataContext)
{
if (dataContext == null) throw new ArgumentNullException("dataContext");
return() => dataContext.Products.AsEnumerable();
}
}
これは基本的に事実を利用している我々は(ケースを誇張しないように削除いくつかの改行)から行くことができるので、これは、コードサイズのためのいくつかの利点を持っています一度あなたが依存性注入で十分に遠くに行くと、多くのクラスは閉鎖以上になりません。これらのクラスはlambdaを返す関数に置き換えることができます。関連する関数(可変状態をカプセル化する必要はなく、 "標準"依存関係注入でクラスを使用して表現される)は、静的クラス(またはVBの用語では "モジュール")にロールアップできます。 。
これはすべてうまくいいですが、私はCastle Windsorでこれらの静的メソッドを登録する最良の方法を見つけるのが難しいです。依存関係のないメソッドは簡単です:
Component.For<DGetIntegers>().Instance(Integers.GetOneToTen)
しかし、上記のDataContextFunctions.GetProductsにはいくつかの依存関係があります。私はこれを登録するために見つけた最良の方法は次のとおりです。
Component.For<DGetProducts>().UsingFactoryMethod(
kernel => DataContextFunctions.GetProducts(kernel.Resolve<DataContext>())
これは非常に冗長取得し、明らかに種類のポイントを少し倒し各依存関係のためにカーネルを直接依頼することができました。コンテナが必要とするすべての静的情報が利用可能なので、これを行うことが可能であるはずです。
Castle Windsor(またはその他のコンテナ)はこれを行うための簡単な方法がありますか、技術的な問題が発生しているのか、あまりにも隙間のあるユースケースです含まれている?
ありがとう、Krzysztof。私はいつかそれを試し、結果を報告します。良い場所を始めるためのリンクはありますか? – ninjeff
@ninjeffもしあなたが2.5.xであれば、ドキュメンテーションはあなたがdocs.castleproject.org/(S(hucszcu5ilznbv45fvrim355))/を始めなければなりません。もしあなたが3.0ベータ版であれば、コンセプトはまだありますが、APIの変更があります同じ。ドコが完璧でない場合は私に教えてください –
私はこれを働かせることができました。私は1時間で自分の答えでリンクと説明を投稿します(私のような低カルマのユーザーは8時間以内に自分の質問に答えることはできません)。 – ninjeff