C# ASP.NET核心,基于通用存储库接口的通用控制器实现

C# ASP.NET核心,基于通用存储库接口的通用控制器实现,c#,asp.net-core,generics,interface,repository-pattern,C#,Asp.net Core,Generics,Interface,Repository Pattern,我在用实体实现CRUD操作的通用控制器时遇到问题 目前我有以下课程: public class BaseItem { public int? Id { get; set; } } 此类是多个实体的父级: public class Customer : BaseItem { // some fields } public class Project : BaseItem { // some fiel

我在用实体实现CRUD操作的通用控制器时遇到问题

目前我有以下课程:

public class BaseItem
    {
        public int? Id { get; set; }
    }
此类是多个实体的父级:

public class Customer : BaseItem
    {
        // some fields
    }

    public class Project : BaseItem
    {
        // some fields
    }
然后是通用存储库的接口:

    public interface IGenericItemRepository<TDomain>
                     where TDomain : BaseItem
    {
        // methods
    }
然后我尝试实现通用控制器:

    public interface IBaseController<TDomain, TDetailsViewModel, TEditViewModel, TRepo>
        where TDomain           :   BaseItem
        where TDetailsViewModel :   BaseViewModel, new()
        where TEditViewModel    :   BaseViewModel, new()
        where TRepo             :   IGenericItemRepository<BaseItem>
    {
        [HttpGet] public IActionResult Edit(int? id);
        [HttpPost] public IActionResult Edit(TDomain entity);
        [HttpGet] public IActionResult Details(int? id);
    }

public class BaseController<TDomain, TDetailsViewModel, TEditViewModel, TRepo> : Controller, IBaseController<TDomain, TDetailsViewModel, TEditViewModel, TRepo>
        where TDomain : BaseItem
        where TDetailsViewModel : BaseViewModel, new()
        where TEditViewModel : BaseViewModel, new()
        where TRepo : IGenericItemRepository<BaseItem>
    {
        private IGenericItemRepository<BaseItem> _repo;

        public BaseController(IGenericItemRepository<BaseItem> repo)
        {
            _repo = repo;
        }
    }

非常感谢您提前提供的帮助

BaseController
IBaseController
中尝试
IGenericItemRepository
而不是
IGenericItemRepository

public class BaseController<TDomain, TDetailsViewModel, TEditViewModel, TRepo> : Controller, IBaseController<TDomain, TDetailsViewModel, TEditViewModel, TRepo> 
    where TDomain : BaseItem
    where TDetailsViewModel : BaseViewModel, new()
    where TEditViewModel : BaseViewModel, new()
    where TRepo : IGenericItemRepository<TDomain>
{
    private IGenericItemRepository<TDomain> _repo;

    public BaseController(IGenericItemRepository<TDomain> repo)
    {
        _repo = repo;
    }
}

 public interface IBaseController<TDomain, TDetailsViewModel, TEditViewModel, TRepo>
    where TDomain           :   BaseItem
    where TDetailsViewModel :   BaseViewModel, new()
    where TEditViewModel    :   BaseViewModel, new()
    where TRepo             :   IGenericItemRepository<TDomain>
{
    [HttpGet] public IActionResult Edit(int? id);
    [HttpPost] public IActionResult Edit(TDomain entity);
    [HttpGet] public IActionResult Details(int? id);
}
公共类BaseController:控制器,IBaseController
其中TDomain:BaseItem
其中TDetailsViewModel:BaseViewModel,new()
其中TEditViewModel:BaseViewModel,new()
何处TRepo:IGenericItemRepository
{
私人IGenericitemRepo;
公共BaseController(IGenericItemRepository repo)
{
_回购=回购;
}
}
公共接口IBaseController
其中TDomain:BaseItem
其中TDetailsViewModel:BaseViewModel,new()
其中TEditViewModel:BaseViewModel,new()
何处TRepo:IGenericItemRepository
{
[HttpGet]公共IActionResult编辑(int?id);
[HttpPost]公共IActionResult编辑(TDomain实体);
[HttpGet]公共IActionResult详细信息(int?id);
}
但是我的
icCustomerRepository
IGenericItemRepository
的类型,不是吗?不,看
    public class MockCustomerRepository : GenericMockRepository<Customer>, ICustomerRepository
    {
        public MockCustomerRepository() : base()
        {
            CreateCustomersList();
        }

        private void CreateCustomersList()
        {
            // method body
        }
    }
public class CustomersController : Controller
    {
        private ICustomerRepository _customerRepo;

        public CustomersController(ICustomerRepository customerRepo)
        {
            _customerRepo = customerRepo;
        }
    }
    public interface IBaseController<TDomain, TDetailsViewModel, TEditViewModel, TRepo>
        where TDomain           :   BaseItem
        where TDetailsViewModel :   BaseViewModel, new()
        where TEditViewModel    :   BaseViewModel, new()
        where TRepo             :   IGenericItemRepository<BaseItem>
    {
        [HttpGet] public IActionResult Edit(int? id);
        [HttpPost] public IActionResult Edit(TDomain entity);
        [HttpGet] public IActionResult Details(int? id);
    }

public class BaseController<TDomain, TDetailsViewModel, TEditViewModel, TRepo> : Controller, IBaseController<TDomain, TDetailsViewModel, TEditViewModel, TRepo>
        where TDomain : BaseItem
        where TDetailsViewModel : BaseViewModel, new()
        where TEditViewModel : BaseViewModel, new()
        where TRepo : IGenericItemRepository<BaseItem>
    {
        private IGenericItemRepository<BaseItem> _repo;

        public BaseController(IGenericItemRepository<BaseItem> repo)
        {
            _repo = repo;
        }
    }
public class CustomersController : BaseController<Customer, BaseViewModel, BaseViewModel, ICustomerRepository>
    {
        private ICustomerRepository _customerRepo;

        public CustomersController(ICustomerRepository customerRepo)
        {
            _customerRepo = customerRepo;
        }
    }
public interface IBaseRepository
{
  T Get<T>(int id);
  void Save<T>(T entity);
}
public class BaseController<TDomain, TDetailsViewModel, TEditViewModel, TRepo> : Controller, IBaseController<TDomain, TDetailsViewModel, TEditViewModel, TRepo> 
    where TDomain : BaseItem
    where TDetailsViewModel : BaseViewModel, new()
    where TEditViewModel : BaseViewModel, new()
    where TRepo : IGenericItemRepository<TDomain>
{
    private IGenericItemRepository<TDomain> _repo;

    public BaseController(IGenericItemRepository<TDomain> repo)
    {
        _repo = repo;
    }
}

 public interface IBaseController<TDomain, TDetailsViewModel, TEditViewModel, TRepo>
    where TDomain           :   BaseItem
    where TDetailsViewModel :   BaseViewModel, new()
    where TEditViewModel    :   BaseViewModel, new()
    where TRepo             :   IGenericItemRepository<TDomain>
{
    [HttpGet] public IActionResult Edit(int? id);
    [HttpPost] public IActionResult Edit(TDomain entity);
    [HttpGet] public IActionResult Details(int? id);
}