Autofac没有使用'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'找到的构造函数

时间:2015-07-15 14:55:02

标签: c# dependency-injection inversion-of-control autofac ioc-container

  

在“LMS.Services.Security.EncryptionService”类型的'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'中找到的构造函数都不能使用可用的服务和参数调用:   无法解析构造函数'Void .ctor(LMS.Models.SecuritySettings)'的参数'LMS.Models.SecuritySettings securitySettings'

以下是代码文件

服务类

public class EncryptionService : IEncryptionService
{
    private readonly SecuritySettings _securitySettings;
    public EncryptionService(SecuritySettings securitySettings)
    {
        this._securitySettings = securitySettings;
    }
}

引导程序

private static void SetAutofacContainer()
{
    var builder = new ContainerBuilder();
    builder.RegisterControllers(Assembly.GetExecutingAssembly());
    builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest();
    builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerRequest();

    builder.RegisterAssemblyTypes(typeof(CourseRepository).Assembly)
           .Where(t => t.Name.EndsWith("Repository"))
           .AsImplementedInterfaces()
           .InstancePerRequest();

    builder.RegisterAssemblyTypes(typeof(CourseService).Assembly)
           .Where(t => t.Name.EndsWith("Service"))
           .AsImplementedInterfaces()
           .InstancePerRequest();

    builder.RegisterFilterProvider();
    var container = builder.Build();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}

它提前工作了。但是当我介绍EncryptionService实现时,我收到了上述错误。 以下是其他工作代码实现,如下所示

public class CourseService : ICourseService
{
    #region Fields

    private readonly IRepository<Course> _courseRepository;
    private readonly IUnitOfWork _unitOfWork;

    #endregion

    #region ctor

    public CourseService(IRepository<Course> courseRepository, IUnitOfWork unitOfWork)
    {
        _courseRepository = courseRepository;
        _unitOfWork = unitOfWork;
    }
    #endregion
}

3 个答案:

答案 0 :(得分:16)

Autofac 尝试解析EncryptionService时,它会尝试解析SecuritySettings服务,但 Autofac 却不知道此类注册。

要解决此错误,您应该注册SecuritySettings实施。

例如:

builder.RegisterType<SecuritySettings>()
       .As<SecuritySettings>(); 

答案 1 :(得分:2)

您还可以通过添加AnyConcreteTypeNotAlreadyRegisteredSource(参见the docs for Sources)来调整Autofac的行为,使其按照您最初预期的方式工作[并与其他一些容器的默认值保持一致]: -

var builder = new ContainerBuilder();
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());

我已经将这个方案与delegate factoriesimplicit Relationship Types一起使用,几乎从一系列应用中移除了明确的注册,但是你似乎已经走上了明确的道路(boilerplaty:P )注册我建议使用Google AnyConcreteTypeNotAlreadyRegisteredSource来查看更广泛的方案是否适合您更好的方式。

答案 2 :(得分:1)

在我的情况下,我没有注册上下文。我注册了上下文,它对我有用

builder.RegisterType<JComDbEntities>().AsSelf().As<DbContext>().InstancePerLifetimeScope();