Autofacでは、依存関係を管理する最も簡単な方法は、コンストラクタインジェクションを活用することです。
基本的には、Autofacに "私のためのプロパティを結び付けてあなたのモジョをする"と言っているのではなく、コンポーネントのリストを宣言することをあなたに任せてください。
ので
、代わりにプロパティの注入はヘルパーコンストラクタで明示的にあなたの依存関係を宣言し、動作していない理由を不思議の:
public class Helper
{
public DbContext Context { get; private set; }
public Helper(DbContext context /* Autofac is going to fill in this */)
{
Context = context;
}
}
次に、グローバルでの(またはご登録をカプセル化するいくつかの他のクラスで)あなただけにAutofacを伝えますHelper
タイプを見て、あなたがすることができる最も簡単なことである最高のコンストラクタを呼び出すために彼の最善を試してみてください。
// Either InstancePerDependency, or SingleInstance, or something else depending upon you requirements.
builder.RegisterType<Helper>().AsSelf().InstancePerDependency();
そして、あなたが行われる必要があります:Autofacは、ほとんどのパラメータ(およびTHERを持つコンストラクタを検索しますeはDbContext
のパラメータを持つ唯一のものになり、要求されたタイプ(可能なもの)のパラメータを作成する方法を知っているかどうかをチェックします。
だから、あなたはすぐにヘルパーを使うことができます!
編集:私はそれは質問に対する正しい答えだから、上記の例を維持するんだけど、コメントに返信して、私はInitメソッドの形で、もう少し機械を使用します。
public class Helper
{
public DbContext Context { get; private set; }
public Init(DbContext context /* Autofac is going to fill in this */)
{
Context = context;
}
}
そして、あなたは、オブジェクトの初期化時に、このメソッドを呼び出すためにAutofacを指示することができます。
builder.RegisterType<CustomHelper>().AsSelf().InstancePerDependency()
.OnActivating(h => {
var dbContext = h.Context.Resolve<DbContext>();
((Helper)h.Instance).Init(context);
});
OnActivatingは、明示的な初期化呼び出しを記述することができます。 Helper
から派生したアセンブリですべての型を登録したいと思うかもしれませんが、それはおそらく別の質問です。
ヘルパークラスのコンストラクタ署名を渡せますか?私が知る限り、WithParameterまたはPropertiesAutowiredが必要ですが、両方ではありません。また、HelperコンストラクタにDbContext型のパラメータがある場合は、どちらも必要ありません。 –
ご返信ありがとうございます。空のコンストラクタ、つまりpublic Helper(){}です。 – Chris
'Context'プロパティのコードを共有できますか?それは一般に公開されていますか? –