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.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 参数) 在 \autofac\src\Source\Autofac\Core\Activators\Reflection\ReflectionActivator.cs:line 117    
    在 Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 参数) 在 \autofac\src\Source\Autofac\Core\Resolving\InstanceLookup.cs:line 79
    在 Autofac.Core.Resolving.InstanceLookup.Execute() 在 \autofac\src\Source\Autofac\Core\Resolving\InstanceLookup.cs:line 62
    在 Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration 注册, IEnumerable`1 参数) 在 \autofac\src\Source\Autofac\Core\Resolving\ResolveOperation.cs:line 124
    在 Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration 注册,IEnumerable`1 参数) 在 \autofac\src\Source\Autofac\Core\Resolving\InstanceLookup.cs:line 115  
    在 Autofac.Features.Collections.CollectionRegistrationSource.c__DisplayClass4.c__DisplayClass6.b__1(IComponentRegistration cr) 在 \autofac\src\Source\Autofac\Features\Collections\CollectionRegistrationSource.cs: System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext 的第 80 行()  
    在 System.Linq.Buffer`1..ctor(IEnumerable`1 源)    
    在 System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 源)
    在 Autofac.Features.Collections.CollectionRegistrationSource.c__DisplayClass4.b__0(IComponentContext c, IEnumerable`1 p) 在 \autofac\src\Source\Autofac\Features\Collections\CollectionRegistrationSource.cs:line 80    
    在 Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable`1 参数) 在 \autofac\src\Source\Autofac\Core\Activators\Delegate\DelegateActivator.cs:line 65
    在 Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 参数) 在 \autofac\src\Source\Autofac\Core\Resolving\InstanceLookup.cs:line 79   
    在 Autofac.Core.Resolving.InstanceLookup.Execute() 在 \autofac\src\Source\Autofac\Core\Resolving\InstanceLookup.cs:line 62   
    在 Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration 注册, IEnumerable`1 参数) 在 \autofac\src\Source\Autofac\Core\Resolving\ResolveOperation.cs:line 124    
    在 Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration 注册,IEnumerable`1 参数) 在 \autofac\src\Source\Autofac\Core\Resolving\InstanceLookup.cs:line 115  
    在 Autofac.Core.Activators.Reflection.AutowiringParameter.c__DisplayClass2.b__0() 在 \autofac\src\Source\Autofac\Core\Activators\Reflection\AutowiringParameter.cs:line 51    
    在 Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate() 在 \autofac\src\Source\Autofac\Core\Activators\Reflection\ConstructorParameterBinding.cs:line 113    
    在 Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 参数) 在 \autofac\src\Source\Autofac\Core\Activators\Reflection\ReflectionActivator.cs:line 119    
    在 Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 参数) 在 \autofac\src\Source\Autofac\Core\Resolving\InstanceLookup.cs:line 79   
    在 Autofac.Core.Resolving.InstanceLookup.b__0() 在 \autofac\src\Source\Autofac\Core\Resolving\InstanceLookup.cs:line 64   
    在 Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id, Func`1 creator) 在 \autofac\src\Source\Autofac\Core\Lifetime\LifetimeScope.cs:line 269    
    在 Autofac.Core.Resolving.InstanceLookup.Execute() 在 \autofac\src\Source\Autofac\Core\Resolving\InstanceLookup.cs:line 64   
    在 Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration 注册, IEnumerable`1 参数) 在 \autofac\src\Source\Autofac\Core\Resolving\ResolveOperation.cs:line 124    
    在 Autofac.Core.Resolving.ResolveOperation.ResolveComponent(IComponentRegistration 注册,IEnumerable`1 参数) 在 \autofac\src\Source\Autofac\Core\Resolving\ResolveOperation.cs:line 69
    在 Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration 注册,IEnumerable`1 参数)在 \autofac\src\Source\Autofac\Core\Resolving\ResolveOperation.cs:line 96
    在 Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration 注册,IEnumerable`1 参数) 在 \autofac\src\Source\Autofac\Core\Lifetime\LifetimeScope.cs:line 235    
    在 Autofac.Core.Container.ResolveComponent(IComponentRegistration 注册,IEnumerable`1 参数) 在 \autofac\src\Source\Autofac\Core\Container.cs:line 191    
    在 Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance) in \autofac\src\Source\Autofac\ResolutionExtensions.cs:line 728    
    在 Autofac.ResolutionExtensions.ResolveService(IComponentContext 上下文,服务服务,IEnumerable`1 参数)在 \autofac\src\Source\Autofac\ResolutionExtensions.cs:line 346    
    在 Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable`1 parameters) in \autofac\src\Source\Autofac\ResolutionExtensions.cs:line 244 at Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context, IEnumerable`1参数)在 \autofac\src\Source\Autofac\ResolutionExtensions.cs:line 197    
    在 Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context, Parameter[] 参数) 在 \autofac\src\Source\Autofac\ResolutionExtensions.cs:line 213

这是我的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 回答