我正在尝试将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/

10-09 06:01