繁体   English   中英

asp.net-ef-通用服务/存储库模式

[英]asp.net - ef - generic service/repository pattern

我正在使用具有通用存储库类EFRepositoryBase的服务/存储库模式,其中T:ModelBase,new()T是从ef继承中使用的所有poco的类。 EFRepositoryBase具有读取方法

public IQueryable<T> Read()
{
        try
        {
            return db.Set<T>();
        }
        catch (Exception)
        {
            throw new IRepositoryException();
        }
}

每个服务都从ServiceBase继承,该服务具有EFRepository类型的回购属性。

出于性能原因,发现我最好使用sql-view显示订单列表,因为该列表从其他表格中获取了大量数据,并具有计算字段,....为了进行测试,我在sql中创建了一个视图,poco (OrderIndexItem)映射到它,在上下文中添加了一个DBset vwOrderIndex ...一切正常。 问题在于,目前我直接在服务中寻址db.vwOrderIndex。 下一步是使其通用。

想法是向ModelBase添加一个静态属性,该属性包含相关“视图poco”的类型。

public static Type IndexItemType { get; set; } = null;

并向Order添加一个静态构造函数以设置该类型

static  Order()
{
    IndexItemType = typeof(OrderIndexItem);
}

在通用存储库中,我添加了一个额外的方法

    public IQueryable<TIndex> ReadIndex<TIndex>() where TIndex : ModelBase, IModelBaseIndexItem
    {
        try
        {
        }
        catch (Exception)
        {
            throw new IRepositoryException();
        }
    }

这个想法是通过静态属性IndexItemType返回与T关联的DbSet类型。

有什么想法吗 ?

另一种可接受的解决方案可能只是使用关联的IndexItemType的命名约定,例如Order-OrderIndexItem,Member-MemberIndexItem,...

在这两种方法中,我都无法解决的问题:如何返回适当的DbSet?

第三种方法可能是将EFRepositoryBase更改为

public class EFRepositoryBase<T, TIndex> : IRepository<T, TIndex> where T : ModelBase, new() where TIndex : ModelBase, IModelBaseIndexItem, new()

尽管对代码的影响是巨大的,所以我不愿使用此方法,除非它是唯一的方法。

使用命名约定的可行解决方案:

public IQueryable<IModelBaseIndexItem> ReadIndex()
{
    try
    {
        Type TIndexItem = typeof(T).Assembly.GetType(typeof(T).FullName + "IndexItem");
        return (IQueryable<IModelBaseIndexItem>) db.Set(TIndexItem);
    }
    catch (Exception)
    {
        throw new IRepositoryException();
    }
}

最终,我寻求以下解决方案,以不将存储库限制为每个ModelBase POCO仅一种视图类型。

   public IQueryable<TSqlView> ReadSqlView<TSqlView>() where TSqlView : ISqlViewItem, new()
    {
        try
        {
            return (IQueryable<TSqlView>)Db.Set( typeof(TSqlView));
        }
        catch (Exception)
        {
            throw new IRepositoryException();
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM