首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带接口的ef6存储库模式

带接口的ef6存储库模式
EN

Stack Overflow用户
提问于 2017-09-19 13:59:54
回答 1查看 377关注 0票数 1

aLets有一个简单的场景:

代码语言:javascript
复制
public interface IMember
{
    string Name { get; set; }
}

public class MemberEF6Impl : IMember
{
    //some annotations...
    public string Name { get; set; }
}

public class MemberVMImpl : IMember
{
    //some other annotations...
    public string Name { get; set; }

    //some functionality...
}

我有两个在我们的程序中的所有接口的具体实现。一个实现,特别是数据库迁移,一个为我们的视图模型。现在,我想实现factory-pattern,并增加一个接口和两个具体的实现:

代码语言:javascript
复制
public interface IRepository
{
    ICollection<TModel> GetAll<TModel>() where TModel : class;
    //some more functionality...
}


public class RepositoryEF6Impl : IRepository
{
    protected readonly DbContext context;

    public RepositoryEF6Impl(DbContext context)
    {
        this.context = context;
    }
    public ICollection<TModel> GetAll<TModel>() where TModel : class
    {
         return context.Set<TModel>().ToList();
    }
    //some more functionality...
}

现在,我可以直接使用存储库,如下所示:

代码语言:javascript
复制
IRepository repo = new RepositoryEF6Impl(context);
repo.GetAll<MemberEF6Impl>();

到目前一切尚好。但我想用这个方法:

代码语言:javascript
复制
IRepository repo = new RepositoryEF6Impl(context);
repo.GetAll<IMember>(); //note the difference

问题是数据库中没有IMember,只有一个MemberEF6Impl。

为什么我想用这种方式:

因为对于数据库和视图模型,我们有不同的具体类,所以我必须为视图模型创建第二个存储库,它只是具体的VMImpl类和EF6存储库之间的一个层。

代码语言:javascript
复制
public class RepositoryVMImpl : IRepository
{
    protected readonly IRepository repository;

    public RepositoryVMImpl(IRepository repository)
    {
        this.repository = repository;
    }

    public ICollection<TModel> GetAll<TModel>() where TModel : class
    {
        return repository.GetAll<TModel>();
    }
}

有办法做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-19 14:23:19

我的建议是使用单个存储库,但使用某种方法重载以突出所请求的泛型类型。

方法过载:

代码语言:javascript
复制
public ICollection<TProjection> GetAll<TModel, TProjection>(Expression<Func<TModel, TProjection>> projection)
{
      return context.Set<TModel>().Select(projection).ToList();
}

然后您可以使用这样的方法,它将控制返回类型。

代码语言:javascript
复制
repository.GetAll<MemberEF6Impl, IMember>(memberEF => new MemberVMImp { ... })

如果仍然需要EF实体模型作为结果类型,则可以使用当前方法:

代码语言:javascript
复制
repository.GetAll<MemberEF6Impl>();

有关EF预测的更多信息:https://www.tektutorialshub.com/projection-queries-entity-framework/

此外,自动机还提供了这样的功能--它可以节省您一些时间。你应该去看看。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46302475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档