繁体   English   中英

Autofac-注册抽象泛型类失败

[英]Autofac - Register Abstract Generic Class Failure

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

所以我有这样的错误。

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

错误图片

经过一点改变。

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容器。 我尝试了许多其他主题,因为您可以在配置类上看到注释行,但找不到任何解决方案。

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

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

看起来您具有通用类型EfEntityRepositoryBase<TEntity, TContext> ,可以像这样使用。 您似乎已经尝试过注册该类,但是您没有填写类型参数,autofac无法为您完成此操作。 您可能会这样注册:

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

(我只是假设TContext类型参数有DepartmentContext之类的东西。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM