C# ASP.NET核心,基于通用存储库接口的通用控制器实现
我在用实体实现CRUD操作的通用控制器时遇到问题 目前我有以下课程: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
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);
}