我正在尝试将Unit of Work
实施到我的项目中,并提出一些快速问题。我正在使用显示为by this tutorial的类:
因此,当我实现它时,可以说我将Users类设为GenericRepository
。如果有些项目要添加到Users
类而不是GenericRepository
的一部分,该怎么办。
如何创建另一个接口并使用某种类型的继承,因此我仍然可以从GenericRepository
中获得所需的信息以及所需的新功能。
我基本上想扩展它。
public interface ICategoryRepository : IGenericRepository<Category>
{
IEnumerable<LocalComicCategoriesModel> GetCategories();
IEnumerable<LocalComicCategoriesModel> GetCategoriesByComicID(int comicid, bool appendCategories);
}
public class CategoryRepository : GenericRepository<Category>, ICategoryRepository
{
new ComicEntities context;
public CategoryRepository(ComicEntities context) : base(context)
{
this.context = context;
}
public IEnumerable<LocalComicCategoriesModel> GetCategories()
{
return context.Categorys.Select(i => new LocalComicCategoriesModel { Id = i.Category_Id, Title = i.Name });
}
public IEnumerable<LocalComicCategoriesModel> GetCategoriesByComicID(int comicid, bool appendCategories)
{
if (appendCategories == true)
{
IEnumerable<LocalComicCategoriesModel> query = from tbcat in context.Categorys
join tbitem_cat in context.ComicCategorys.Where(i => i.Comic_Id == comicid)
on tbcat.Category_Id equals tbitem_cat.Category_Id into ct
from tbitem_cat in ct.DefaultIfEmpty()
select new LocalComicCategoriesModel
{
Id = tbcat.Category_Id,
Title = tbcat.Name,
isChecked = tbitem_cat == null ? false : true
};
return query;
}
else
{
IEnumerable<LocalComicCategoriesModel> returnedCategories = from t in context.Categorys
join v in context.ComicCategorys on t.Category_Id equals v.Category_Id
where v.Comic_Id == comicid
select new LocalComicCategoriesModel
{
Id = v.Category_Id,
isChecked = true,
Title = t.Name
};
return returnedCategories;
}
}
}
我收到此错误:
'Comics.Models.Category' cannot be used as type parameter 'TEntity' in the generic type or method 'Comics.DAL.Interfaces.GenericRepository<TEntity>'. There is no implicit reference conversion from 'Comics.Models.Category' to 'Comics.DAL.Interfaces.IGenericRepository<Comics.Models.Category>'.
最佳答案
假设您有一个基本/通用存储库接口,如下所示
public interface IRepository<T> where T : class
{
IQueryable<T> All();
IQueryable<T> Find(Expression<Func<T, bool>> predicate);
T GetById(int id);
// and the rest of your methods
}
如果您有一个“普通”类想要为其实现此通用存储库,则可以这样做
IRepository<MyClass> MyClassRepository
现在,对于需要其他功能的类(例如您的
User
类),您将创建一个额外的存储库,如下所示:public interface IUserRepository : IRepository<User>
{
IQueryable<User> AllAuthorized();
IQueryable<User> AllConfirmed();
}
然后要使用它,请从您的通用存储库继承,并使其实现您的
IUserRepository
接口。 public class UserRepository : Repository<User>, IUserRepository
{
public IQueryable<User> AllAuthorized()
{
// implement here
}
public IQueryable<User> AllConfirmed()
{
// implement here
}
}
现在,不用实例化
IRepository<User>
,而是使用IUserRepository
关于c# - 扩展 Entity Framework 的工作单元,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21652537/