7

私は Autofac を初めて使用し、次の例外を除いて理解を深めたいと考えています。これに関するヘルプ/ポインタは大歓迎です!

次の取得Autofac.Core.DependencyResolutionException

未処理の例外:
    Autofac.Core.DependencyResolutionException:
        タイプ 'Test.Authorization.LoginService' の 'パブリック バインディング フラグ' で見つかったコンストラクターは、利用可能なサービスとパラメーターで呼び出すことができません。
         コンストラクター 'Void .ctor(System.Func`1[System.IO.Stream], System.Func`1[System.IO.Stream] のパラメーター 'System.Func`1[System.IO.Stream] readStream' を解決できません)」。
    \autofac\src\Source\Autofac\Core\Activators\Reflection\ReflectionActivator.cs:line 117 の Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance (IComponentContext コンテキスト、IEnumerable`1 パラメーター) で    
    \autofac\src\Source\Autofac\Core\Resolving\InstanceLookup.cs:line 79 の Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters) で
    \autofac\src\Source\Autofac\Core\Resolving\InstanceLookup.cs:line 62 の Autofac.Core.Resolving.InstanceLookup.Execute() で
    Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance (ISharingLifetimeScope currentOperationScope、IComponentRegistration 登録、IEnumerable`1 パラメーター) で \autofac\src\Source\Autofac\Core\Resolving\ResolveOperation.cs:124 行目
    \autofac\src\Source\Autofac\Core\Resolving\InstanceLookup.cs:line 115 の Autofac.Core.Resolving.InstanceLookup.ResolveComponent (IComponentRegistration 登録、IEnumerable`1 パラメーター) で  
    System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext の \autofac\src\Source\Autofac\Features\Collections\CollectionRegistrationSource.cs:line 80 の Autofac.Features.Collections.CollectionRegistrationSource.c__DisplayClass4.c__DisplayClass6.b__1(IComponentRegistration cr) で()  
    System.Linq.Buffer`1..ctor(IEnumerable`1 ソース) で    
    System.Linq.Enumerable.ToArray[TSource] (IEnumerable`1 ソース) で
    \autofac\src\Source\Autofac\Features\Collections\CollectionRegistrationSource.cs:line 80 の Autofac.Features.Collections.CollectionRegistrationSource.c__DisplayClass4.b__0(IComponentContext c, IEnumerable`1 p) で    
    \autofac\src\Source\Autofac\Core\Activators\Delegate\DelegateActivator.cs:line 65 の Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance (IComponentContext コンテキスト、IEnumerable`1 パラメーター) で
    \autofac\src\Source\Autofac\Core\Resolving\InstanceLookup.cs:line 79 の Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters) で   
    \autofac\src\Source\Autofac\Core\Resolving\InstanceLookup.cs:line 62 の Autofac.Core.Resolving.InstanceLookup.Execute() で   
    Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance (ISharingLifetimeScope currentOperationScope、IComponentRegistration 登録、IEnumerable`1 パラメーター) で \autofac\src\Source\Autofac\Core\Resolving\ResolveOperation.cs:124 行目    
    \autofac\src\Source\Autofac\Core\Resolving\InstanceLookup.cs:line 115 の Autofac.Core.Resolving.InstanceLookup.ResolveComponent (IComponentRegistration 登録、IEnumerable`1 パラメーター) で  
    \autofac\src\Source\Autofac\Core\Activators\Reflection\AutowiringParameter.cs:line 51 の Autofac.Core.Activators.Reflection.AutowiringParameter.c__DisplayClass2.b__0() で    
    \autofac\src\Source\Autofac\Core\Activators\Reflection\ConstructorParameterBinding.cs:line 113 の Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate() で    
    \autofac\src\Source\Autofac\Core\Activators\Reflection\ReflectionActivator.cs:line 119 の Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance (IComponentContext コンテキスト、IEnumerable`1 パラメーター) で    
    \autofac\src\Source\Autofac\Core\Resolving\InstanceLookup.cs:line 79 の Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters) で   
    \autofac\src\Source\Autofac\Core\Resolving\InstanceLookup.cs:line 64 の Autofac.Core.Resolving.InstanceLookup.b__0() で   
    \autofac\src\Source\Autofac\Core\Lifetime\LifetimeScope.cs:line 269 の Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare (Guid id、Func`1 作成者) で    
    \autofac\src\Source\Autofac\Core\Resolving\InstanceLookup.cs:line 64 の Autofac.Core.Resolving.InstanceLookup.Execute() で   
    Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance (ISharingLifetimeScope currentOperationScope、IComponentRegistration 登録、IEnumerable`1 パラメーター) で \autofac\src\Source\Autofac\Core\Resolving\ResolveOperation.cs:124 行目    
    \autofac\src\Source\Autofac\Core\Resolving\ResolveOperation.cs: 69 行目の Autofac.Core.Resolving.ResolveOperation.ResolveComponent (IComponentRegistration 登録、IEnumerable`1 パラメーター) で
    \autofac\src\Source\Autofac\Core\Resolving\ResolveOperation.cs:line 96 の Autofac.Core.Resolving.ResolveOperation.Execute (IComponentRegistration 登録、IEnumerable`1 パラメーター) で
    \autofac\src\Source\Autofac\Core\Lifetime\LifetimeScope.cs:line 235 の Autofac.Core.Lifetime.LifetimeScope.ResolveComponent (IComponentRegistration 登録、IEnumerable`1 パラメーター) で    
    \autofac\src\Source\Autofac\Core\Container.cs:line 191 の Autofac.Core.Container.ResolveComponent (IComponentRegistration 登録、IEnumerable`1 パラメーター) で    
    Autofac.ResolutionExtensions.TryResolveService (IComponentContext コンテキスト、サービス サービス、IEnumerable`1 パラメーター、オブジェクト & インスタンス) で \autofac\src\Source\Autofac\ResolutionExtensions.cs: 728 行目    
    \autofac\src\Source\Autofac\ResolutionExtensions.cs:line 346 の Autofac.ResolutionExtensions.ResolveService (IComponentContext コンテキスト、サービス サービス、IEnumerable`1 パラメーター) で    
    Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable`1 parameters) の \autofac\src\Source\Autofac\ResolutionExtensions.cs:244 行目 Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context, IEnumerable`1)パラメータ) \autofac\src\Source\Autofac\ResolutionExtensions.cs:197行目    
    \autofac\src\Source\Autofac\ResolutionExtensions.cs:line 213 の Autofac.ResolutionExtensions.Resolve[TService](IComponentContext コンテキスト、Parameter[] パラメーター) で

これが私のcsコードです:

    public sealed class AuthorizationModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder
            .Register(LoginService)
            .AsImplementedInterfaces()
            .SingleInstance();
        }

     static LoginService LoginService(IComponentContext c)
     {
         var file = c.Resolve<IFile>();
         var dataPath = <Some Path>;

         return new LoginService
         (readStream: () => file.Open(dataPath),
          writeStream: () => file.Create(dataPath));
     }
    }


    sealed class LoginService : TLoginService.Iface, IService
    {
        readonly Func<Stream> _readStream;
        readonly Func<Stream> _writeStream;
        readonly XmlSerializer _serializer;

        public LoginService(
          Func<Stream> readStream,
          Func<Stream> writeStream
        )
        {
           Contract.Requires(readStream != null);
           Contract.Requires(writeStream != null);
           _readStream = readStream;
           _writeStream = writeStream;
           _serializer = new XmlSerializer(typeof (List<LoginRecord>));
     }
     ...
     ...
4

1 に答える 1

10

あなたのLoginServiceクラスには のようなコンストラクタがありLoginService(Func<System.IO.Stream> stream)ます。Autofac はFunc<System.IO.Stream>引数を作成できません。そのため、Autofac がLoginService.

例えば:

builder.Register(c => new LoginService(d => File.Open("Foo));

Wiki のコンポーネント登録セクションを参照して、適切な方法を見つけてください。

于 2012-05-21T23:54:47.933 に答える