1

インターフェイスを備えた次の非常に単純なViewModelがあります。

public interface ITestViewModel
{
    string Tester { get; }
}

public class TestViewModel : ITestViewModel
{
    public string Tester
    {
        get { return "testing DI"; }
    }
}

次に、このAutofacモジュールを作成しました。

public class TestModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.Register(c => new TestViewModel()).As<ITestViewModel>();
    }
}

ViewModelとこのモジュールは、TestPluginと呼ばれる別のDLLに存在します。

メインアプリケーションから、TestPluginアセンブリを動的にロードしようとしています。これにより、次のコードのように、そのモジュールをコンテナに登録できます。

var builder = new ContainerBuilder();
var plugins = Directory.EnumerateFiles(@"C:\plugins", "TestPlugin.dll", SearchOption.AllDirectories).ToList();
foreach (var plugin in plugins)
{
    var assembly = Assembly.LoadFrom(plugin);
    builder.RegisterAssemblyModules(assembly);
}
var container = builder.Build();
var testResolve = container.Resolve<ITestViewModel>();

何らかの理由で、サービスITestViewModel(TestViewModelのDelegateActivator)のコンポーネント登録を明確に確認できますが、Resolve呼び出しで次の例外が発生します。

Autofac.Core.Registration.ComponentNotRegisteredException was unhandled by user code
HResult=-2146233088
Message=The requested service 'TestPlugin.ITestViewModel' has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.
Source=Autofac
StackTrace:
   at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters)
   at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable`1 parameters)
   at Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context, IEnumerable`1 parameters)
   at Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context)
   at Test.App.<>c__DisplayClass5.<OnStartup>b__0()
   at System.Threading.Tasks.Task.InnerInvoke()
   at System.Threading.Tasks.Task.Execute()
InnerException: 

なぜこれが起こっているのかについて助けていただければ幸いです。私の推測では、これはAssembly.LoadFrom呼び出しと関係があり、ビューモデル/モジュールをメインアプリにプルしようとした場合、登録は正しく機能しているように見えます。

ありがとう!

4

1 に答える 1

1

アセンブリを現在のアプリドメインにロードする必要があります。AppDomain.Loadを見てください。

于 2013-01-15T20:24:22.297 に答える