在我的业务层中。我想创建一个抽象类,并由我所有的实体管理器类实现。
所以我有这样的错误。
没有找到的构造函数 类型上的'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])'
经过一点点改变。
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容器。我尝试了许多其他主题,因为您可以在我的配置类上看到注释行,但找不到任何解决方案。
答案 0 :(得分:0)
错误消息告诉您Autofac无法实例化DepartmentManager
,因为它不知道要为dataAccess参数使用什么。该参数的类型为IDataAccess<Department>
。
要解决此问题,您需要将类型注册为提供IDataAccess<Department>
实施。
看起来你有一个通用类型EfEntityRepositoryBase<TEntity, TContext>
可以像这样使用。您似乎已经尝试注册该类,但您没有填写类型参数,autofac无法为您执行此操作。您可以像这样注册:
builder.RegisterType<EfEntityRepositoryBase<Department,DepartmentContext>>()
.As<IDataAccess<Department>>()
.InstancePerLifetimeScope();
(我只是假设TContext类型参数有类似DepartmentContext
的内容。)