私はC#Asp.Netアプリケーションを構築しています。 私のプロジェクトには3つのアセンブリがあります。Autofac Dependency Injection - アセンブリに基づいて異なるタイプに解決する
- MainAssembly
- AssemblyA
- AssemblyB
AssemblyA
とAssemblyB
はMainAssemblyへの参照を有します。 MainAssemblyはReflectionを使用してAssemblyA
とAssemblyB
をロードします。 タイプが存在するアセンブリに基づいてタイプを解決する必要があります。
つまり、コンストラクタパラメータは、それが属するアセンブリに基づいて、SmsSender
またはEmailSender
に解決される必要があります。
はコードの下に考えてみましょう:
-------------------------- コードMainAssembly内部------- -------------------
//Global Registration
void AutofacRegister()
{
var builder = new ContainerBuilder();
...
...
//Registering the modules in other assemblies
builder.RegisterAssemblyModules(AssemblyA);
builder.RegisterAssemblyModules(AssemblyB);
...
}
interface ISender
{
void SendMessage();
}
------------------------ - AssemblyB内部コード----------------------------
public class ComponentA: Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<SmsSender>().As<ISender>();
}
}
internal class SmsSender : ISender{...}
public class Foo()
{
Foo(ISender sender)
{
//as this is inside a AssemblyA thi should be resolved to type SmsSender
//SmsSender
}
}
-------- ------------------ コードAssemblyB ----------------------------
public class ComponentA: Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<EmailSender>().As<ISender>();
}
}
internal class EmailSender : ISender{...}
public class Bar()
{
Bar(ISender sender)
{
//as this is inside a AssemblyB this should be resolved to type EmailSender
//EmailSender
}
}
内部にはどうすれば要件を達成することができますか? 誰かが簡単な例を提供することで私を助けることができますか?
アセンブリ間の間違った関係を指定しました。今私は質問を更新しました。申し訳ありません。あなたの答えはまだ有効ですか?私は何か変更を行う必要がありますか? – Rahul
はい、答えは 'ISender'がMainAssemblyにあり、AssemblyAとAssemblyBがMainAssemblyへの参照を持っている場合に有効です – tdragon
Foo&Barクラスが基本クラスから派生していて、もし私がAutofacで基底クラス型を解決する必要があれば?あなたの答えは次のようになります。 'builder.RegisterType() .WithParameter((p、c)...' –
Rahul