[英]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.