C# 具有相同结构的控制器无法使用接口工作
我已经使用相同的结构为我的项目分别创建了8个模型和控制器,但是现在这个结构不起作用。它给了我这个错误: 当前类型HelpDesk.Contracts.Repositories.IRepositoryBase`1[HelpDesk.Model.Knowledgebase]是一个接口,无法构造。是否缺少类型映射 这是我的界面:C# 具有相同结构的控制器无法使用接口工作,c#,asp.net-mvc,interface,datacontext,C#,Asp.net Mvc,Interface,Datacontext,我已经使用相同的结构为我的项目分别创建了8个模型和控制器,但是现在这个结构不起作用。它给了我这个错误: 当前类型HelpDesk.Contracts.Repositories.IRepositoryBase`1[HelpDesk.Model.Knowledgebase]是一个接口,无法构造。是否缺少类型映射 这是我的界面: namespace HelpDesk.Contracts.Repositories { public interface IRepositoryBase<
namespace HelpDesk.Contracts.Repositories
{
public interface IRepositoryBase<TEntity>
where TEntity : class
{
void Commit();
void Delete(object id);
void Delete(TEntity entity);
System.Linq.IQueryable<TEntity> GetAll();
System.Linq.IQueryable<TEntity> GetAll(object filter);
TEntity GetById(object id);
TEntity GetFullObject(object id);
System.Linq.IQueryable<TEntity> GetPaged(int top = 20, int skip = 0, object orderBy = null, object filter = null);
void Insert(TEntity entity);
void Update(TEntity entity);
}
}
namespace HelpDesk.Contracts.Repositories
{
公共接口IRepositoryBase
地点:班级
{
无效提交();
作废删除(对象id);
无效删除(潜在实体);
System.Linq.IQueryable GetAll();
System.Linq.IQueryable GetAll(对象过滤器);
TEntity GetById(对象id);
TEntity GetFullObject(对象id);
System.Linq.IQueryable GetPaged(int-top=20,int-skip=0,object-orderBy=null,object-filter=null);
无效插入(TEntity实体);
无效更新(潜在实体);
}
}
这是我的控制器:
namespace HelpDesk.WebUI.Controllers
{
public class KnowledgebaseController : Controller
{
private DataContext db = new DataContext();
IRepositoryBase<Knowledgebase> knowledgebases;
public KnowledgebaseController(IRepositoryBase<Knowledgebase> knowledgebases)
{
this.knowledgebases = knowledgebases;
}
public ActionResult ChooseSearchView()
{
string r = Session["LoggedUserRole"].ToString();
if (r == "Technician")
{
return RedirectToAction("TechKnowledgebaseSearch");
}
else
{
return RedirectToAction("UserKnowledgebaseSearch");
};
}
namespace HelpDesk.WebUI.Controllers
{
公共类KnowledgebaseController:控制器
{
私有DataContext db=新DataContext();
IRepositoryBase知识库;
公共知识库管理员(IRepositoryBase知识库)
{
this.knowledgebase=知识库;
}
公共操作结果选择搜索视图()
{
字符串r=Session[“LoggedUserRole”].ToString();
如果(r=“技术人员”)
{
返回重定向到操作(“TechKnowledgebaseSearch”);
}
其他的
{
返回重定向到操作(“UserKnowledgebaseSearch”);
};
}
我的数据上下文:
namespace HelpDesk.Contracts.Data
{
public class DataContext : DbContext
{
/// <summary>
/// you can either pass the NAME of a connection string (e.g. from a web.
/// ), and explicitly i
/// </summary>
public DataContext() : base("HelpDesk")
{
}
/// <summary>
/// any entity to be persisted must be declared here.
/// </summary>
///
public DbSet<Category> Categories { get; set; }
public DbSet<Knowledgebase> Knowledgebases { get; set; }
public DbSet<Problem> Problems { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<Ticket> Tickets { get; set; }
public DbSet<TicketNote> TicketNotes { get; set; }
public DbSet<TicketStatus> TicketStatuses { get; set; }
public DbSet<TicketSubscription> TicketSubscriptions { get; set; }
public DbSet<User> Users { get; set; }
}
}
名称空间HelpDesk.Contracts.Data
{
公共类DataContext:DbContext
{
///
///您可以传递连接字符串的名称(例如,从web。
///)而我
///
public DataContext():基本(“帮助台”)
{
}
///
///任何要持久化的实体都必须在此处声明。
///
///
公共数据库集类别{get;set;}
公共数据库集知识库{get;set;}
公共数据库集问题{get;set;}
公共数据库集角色{get;set;}
公共数据库集票证{get;set;}
公共DbSet TicketNotes{get;set;}
公共DbSet ticketstatus{get;set;}
公共DbSet TicketSubscriptions{get;set;}
公共数据库集用户{get;set;}
}
}
以下是repositorybase:
namespace HelpDesk.Contracts.Repositories
{
public abstract class RepositoryBase<TEntity> : HelpDesk.Contracts.Repositories.IRepositoryBase<TEntity> where TEntity : class
{
internal DataContext context;
internal DbSet<TEntity> dbSet;
public RepositoryBase(DataContext context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}
public virtual TEntity GetById(object id)
{
return dbSet.Find(id);
}
public virtual IQueryable<TEntity> GetAll()
{
return dbSet;
}
public IQueryable<TEntity> GetPaged(int top = 20, int skip = 0, object orderBy = null, object filter = null)
{
return null; // need to override in order to implement specific filtering and ordering
}
public virtual IQueryable<TEntity> GetAll(object filter)
{
return null; //need to override in order to implement specific filtering
}
public virtual TEntity GetFullObject(object id)
{
return null; //need to override in order to implement specific obect graph.
}
public virtual void Insert(TEntity entity)
{
dbSet.Add(entity);
}
public virtual void Update(TEntity entity)
{
dbSet.Attach(entity);
context.Entry(entity).State = EntityState.Modified;
}
public virtual void Delete(TEntity entity)
{
if (context.Entry(entity).State == EntityState.Detached)
dbSet.Attach(entity);
dbSet.Remove(entity);
}
public virtual void Delete(object id)
{
TEntity entity = dbSet.Find(id);
}
public virtual void Commit()
{
context.SaveChanges();
}
public virtual void Dispose()
{
context.Dispose();
}
}
}
namespace HelpDesk.Contracts.Repositories
{
公共抽象类RepositoryBase:HelpDesk.Contracts.Repositories.IRepositoryBase其中tenty:class
{
内部数据上下文;
内部数据库集;
公共RepositoryBase(DataContext上下文)
{
this.context=上下文;
this.dbSet=context.Set();
}
公共虚拟实体GetById(对象id)
{
返回dbSet.Find(id);
}
公共虚拟IQueryable GetAll()
{
返回dbSet;
}
public IQueryable GetPaged(int top=20,int skip=0,object orderBy=null,object filter=null)
{
return null;//需要重写以实现特定的筛选和排序
}
公共虚拟IQueryable GetAll(对象筛选器)
{
return null;//需要重写以实现特定的筛选
}
公共虚拟对象(对象id)
{
return null;//需要重写以实现特定的对象图。
}
公共虚拟空白插入(TEntity实体)
{
添加(实体);
}
公共虚拟无效更新(TEntity实体)
{
附加数据集(实体);
context.Entry(entity.State=EntityState.Modified;
}
公共虚拟无效删除(TEntity实体)
{
if(context.Entry(entity.State==EntityState.Detached)
附加数据集(实体);
删除(实体);
}
公共虚拟无效删除(对象id)
{
tenty entity=dbSet.Find(id);
}
公共虚拟无效提交()
{
SaveChanges();
}
公共虚拟void Dispose()
{
context.Dispose();
}
}
}
这里我有一个类似的结构化控制器,工作正常,还有7个类似的控制器:
namespace HelpDesk.WebUI.Controllers
{
public class RoleController : Controller
{
private DataContext db = new DataContext();
IRepositoryBase<Role> roles;
public RoleController(IRepositoryBase<Role> roles)
{
this.roles = roles;
}
namespace HelpDesk.WebUI.Controllers
{
公共类角色控制器:控制器
{
私有DataContext db=新DataContext();
IRepositoryBase角色;
公共角色控制器(IRepositoryBase角色)
{
this.roles=角色;
}
单击此链接时引发异常:
<li>@Html.ActionLink("Knowledgebase", "ChooseSearchView", "Knowledgebase")</li>
@Html.ActionLink(“知识库”、“选择搜索视图”、“知识库”)
不能实例化接口,必须实例化实现该接口的类
public class RepositoryBase<T> : IRepositoryBase
{
public RepositoryBase<T>()
{
}
...
}
公共类RepositoryBase:IRepositoryBase
{
公共存储库()
{
}
...
}
然后用该类型实例化您的具体类
IRepositoryBase<Knowledgebase> knowledgebases = new RepositoryBase<Knowledgebase>();
IRepositoryBase knowledgebase=new RepositoryBase();
在此处阅读有关接口和实例化的更多信息:将KnowledgebaseController构造函数更新为:
public KnowledgebaseController()
{
this.knowledgebases = new RepositoryBase<Knowledgebase>(db);
}
公共知识库控制器()
{
this.knowledgebase=新的存储库(db);
}
并从RepositoryBase
类中删除abstract,以使其可实例化
请注意:这只是一个快速解决方案。要实现一个非常可靠的体系结构,它有助于简化单元测试和松散耦合