Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有相同结构的控制器无法使用接口工作_C#_Asp.net Mvc_Interface_Datacontext - Fatal编程技术网

C# 具有相同结构的控制器无法使用接口工作

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<

我已经使用相同的结构为我的项目分别创建了8个模型和控制器,但是现在这个结构不起作用。它给了我这个错误:

当前类型HelpDesk.Contracts.Repositories.IRepositoryBase`1[HelpDesk.Model.Knowledgebase]是一个接口,无法构造。是否缺少类型映射

这是我的界面:

    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,以使其可实例化

    请注意:这只是一个快速解决方案。要实现一个非常可靠的体系结构,它有助于简化单元测试和松散耦合