Autofac - 注册抽象泛型类失败

时间:2018-03-27 06:43:58

标签: c# asp.net-mvc inversion-of-control autofac

在我的业务层中。我想创建一个抽象类,并由我所有的实体管理器类实现。

所以我有这样的错误。

  

没有找到的构造函数   类型上的'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'   可以使用调用'x.Business.Concrete.DepartmentManager'   可用的服务和参数:无法解析参数   'x.Core.DataAccess.IDataAccess 1[x.Entities.Concrete.Department] dataAccess' of constructor 'Void .ctor(x.Core.DataAccess.IDataAccess 1 [x.Entities.Concrete.Department])'

error image

经过一点点改变。

IDataAccess.cs

public interface IDataAccess<T>

数据访问层

IDepartmentDAL.cs

public interface IDepartmentDAL : IDataAccess<DPT_DEPARTMENT>

EntityFrameworkEntityRepositoryBase.cs

public class EfEntityRepositoryBase<TEntity, TContext> : IDataAccess<TEntity>

EntityFrameworkDepartmentDAL.cs

public class EfDepartmentDAL : EfEntityRepositoryBase<DPT_DEPARTMENT, Context>, IDepartmentDAL

业务逻辑层

ServiceBase.cs

 public abstract class ServiceBase<T> : IDataAccess<T> 
    {
        public IDataAccess<T> _dataAccess;
        public ServiceBase(IDataAccess<T> dataAccess)
        {
            _dataAccess = dataAccess;
        }
    }

DeparmentManager.cs

public class DepartmentManager : ServiceBase<Department>
    {
        public DepartmentManager(IDataAccess<Department> dataAccess) : base(dataAccess)
        {
        }
    }

配置

AutofacModule.cs

protected override void Load(ContainerBuilder builder)
{
    builder.RegisterAssemblyTypes(typeof(ServiceBase<>).Assembly).AsClosedTypesOf(typeof(ServiceBase<>)).InstancePerLifetimeScope();

    builder.RegisterAssemblyTypes(System.Reflection.Assembly.Load("x.DataAccess"))
           .Where(t => t.Name.StartsWith("Ef") && t.Name.EndsWith("DAL"))
           .AsImplementedInterfaces()
           .InstancePerLifetimeScope();

    //builder.RegisterType(typeof(EfEntityRepositoryBase<,>)).As(typeof(IDataAccess<>)).InstancePerRequest();
    //builder.RegisterAssemblyTypes(typeof(EfEntityRepositoryBase<,>).Assembly).AsImplementedInterfaces().InstancePerLifetimeScope();
    //builder.RegisterGeneric(typeof(EfEntityRepositoryBase<,>)).AsSelf();
    //builder.RegisterGeneric(typeof(EfEntityRepositoryBase<,>)).AsImplementedInterfaces().InstancePerLifetimeScope();
    builder.RegisterType(typeof(AssessmentContext)).As(typeof(DbContext)).InstancePerLifetimeScope();
    builder.RegisterGeneric(typeof(EfEntityRepositoryBase<,>)).As(typeof(IDataAccess<>)).InstancePerRequest();
}

那么,我应该如何将我的类型注册到autofac容器。我尝试了许多其他主题,因为您可以在我的配置类上看到注释行,但找不到任何解决方案。

1 个答案:

答案 0 :(得分:0)

错误消息告诉您Autofac无法实例化DepartmentManager,因为它不知道要为dataAccess参数使用什么。该参数的类型为IDataAccess<Department>

要解决此问题,您需要将类型注册为提供IDataAccess<Department>实施。

看起来你有一个通用类型EfEntityRepositoryBase<TEntity, TContext>可以像这样使用。您似乎已经尝试注册该类,但您没有填写类型参数,autofac无法为您执行此操作。您可以像这样注册:

builder.RegisterType<EfEntityRepositoryBase<Department,DepartmentContext>>()
    .As<IDataAccess<Department>>()
    .InstancePerLifetimeScope();

(我只是假设TContext类型参数有类似DepartmentContext的内容。)