2016-07-13 21 views
0

"plugins"フォルダからアセンブリを読み込み、いくつかの実装を動的に登録しています。すべてのアセンブリをロードした後、私はサービスを登録するために進んでAutofac + OWINサービス解決の問題

var appPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 
var pluginsPath = Path.Combine(appPath, path); 

var asmfiles = Directory.EnumerateFiles(pluginsPath, "*.dll", SearchOption.AllDirectories);    

foreach(var asmfile in asmfiles) 
{ 
    Assembly.LoadFile(asmfile); 
} 

builder.RegisterAssemblyTypes(asms) 
     .Where(t => typeof(IValidator).IsAssignableFrom(t)) 
     .AsClosedTypesOf(typeof(IValidator<>)); 

builder.RegisterAssemblyTypes(asms) 
     .Where(t => typeof(IService).IsAssignableFrom(t) && t.IsClass) 
     .AsImplementedInterfaces() 
     .AsSelf(); 

念のため、私はすべての登録をログ:

container.ComponentRegistry 
     .Registrations 
     .SelectMany(x => x.Services) 
     .Select(x => x.Description) 

2016-07-13 09:58:52.5673 TRACE: Registered services: 
    Services.Test.ITestService 
    ServiceModel.IService 
    Services.Test.TestService 
2016-07-13 09:58:52.5673 TRACE: Registered validators: 
    TestRequestValidator 

問題はAutofacがすることはできませんコンストラクタにITestServiceの依存関係を持つコントローラを作成しているようです。

"type": "Autofac.Core.DependencyResolutionException", 
    "message": "None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'ApiHostService.Controllers.EchoController' can be invoked with the available services and parameters: Cannot resolve parameter 'Services.Test.ITestService testService' of constructor 'Void .ctor(Services.Test.ITestService)'.", 

何が問題なのですか?

編集:コンテナからの解決が失敗します。

+1

何が起こりますか? –

+0

解決できません。 – Raine

答えて

1

Assembly.LoadFile(asmfile)を実行すると、同じIDでアセンブリを2回読み込んでいる可能性があります。これにより、解決しようとしているITestService(プロジェクト参照内のITestService)は、コンテナにロードしたITestService(別のアセンブリとしてロードされたITestService)とは異なるものになります。

代わりにAssembly.LoadFrom(asmfile)をお試しください。

この質問を参照してください。また、あなたはロード重複せずに欲しいものを達成します。このアセンブリプリローダーを使用することができます Difference between LoadFile and LoadFrom with .NET Assemblies?

を:あなたは直接コンテナからITestServiceを解決しようとすると、 https://github.com/zidad/net-tools/blob/master/src/Net.Core/Reflection/AssemblyPreloader.cs

+0

AssemblyPreloaderクラスはかなり役に立ちました。私は最終的に実行時にApiControllersを構築し、正しいハンドラに要求をディスパッチするためにMediatorを使用することにしました。いくつかの変更の後、すべてが機能しますが、私は何が問題だったか分かりません。 – Raine

+1

@Raineよろしくお願いします。 –