キャッスルでは、私は別のアセンブリからタイプを登録するために以下を使用していました:
Classes.FromAssemblyNamed("MyServer.DAL")
.Where(type => type.Name.EndsWith("Repository"))
.WithServiceAllInterfaces()
.LifestylePerWebRequest(),
Autofacでは、上記のコードを次のように変更します。
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
.Where(t => t.Name.EndsWith("Repository"))
.InstancePerRequest();
それが正しいか?
これは正しい方法です:
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces()
.InstancePerRequest();
UWPの場合、正しい方法は少し変更されます。
var assemblyType = typeof(MyCustomAssemblyType).GetTypeInfo();
builder.RegisterAssemblyTypes(assemblyType.Assembly)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces()
.InstancePerRequest();
アセンブリごとに、アセンブリに属する単一のタイプを取得し、そこからアセンブリのリンクを取得します。次に、このリンクをビルダーにフィードします。繰り返す。
AppDomain.CurrentDomain.GetAssembliesが依存プロジェクトのアセンブリを返さない場合があります。詳細な説明はこちら AppDomain.GetAssembliesとBuildManager.GetReferencedAssembliesの違い
そのような場合は、プロジェクト内のクラスを使用してそれらのプロジェクトアセンブリを個別に取得し、その型を登録する必要があります。
var webAssembly = Assembly.GetExecutingAssembly();
var repoAssembly = Assembly.GetAssembly(typeof(SampleRepository)); // Assuming SampleRepository is within the Repository project
builder.RegisterAssemblyTypes(webAssembly, repoAssembly)
.AsImplementedInterfaces();
As
の述語オーバーロードを使用できます。 "Repository"
で終わる特定のタイプからGetInterfaces
のすべてのインターフェースを取得し、それらが実装する最初のインターフェースを選択して登録できます。
var Assembly = Assembly.GetExecutingAssembly();
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(Assembly)
.Where(t => t.Name.EndsWith("Repository"))
.As(t => t.GetInterfaces()[0]);