首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何将IRepository<Invoice>和IRepository<Estimate>抽象为IRepository<SalesTransaction>?

将IRepository<Invoice>和IRepository<Estimate>抽象为IRepository<SalesTransaction>可以通过泛型和接口的方式实现。首先,我们需要定义一个泛型接口IRepository<T>,其中T表示实体类型。

代码语言:csharp
复制
public interface IRepository<T>
{
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
    T GetById(int id);
    // 其他操作方法...
}

接下来,我们可以创建Invoice和Estimate实体类,并分别实现IRepository<Invoice>和IRepository<Estimate>接口。

代码语言:csharp
复制
public class Invoice
{
    // Invoice实体类的属性和方法...
}

public class InvoiceRepository : IRepository<Invoice>
{
    public void Add(Invoice entity)
    {
        // 实现Add方法...
    }

    public void Update(Invoice entity)
    {
        // 实现Update方法...
    }

    public void Delete(Invoice entity)
    {
        // 实现Delete方法...
    }

    public Invoice GetById(int id)
    {
        // 实现GetById方法...
        return null;
    }

    // 其他操作方法的实现...
}

public class Estimate
{
    // Estimate实体类的属性和方法...
}

public class EstimateRepository : IRepository<Estimate>
{
    public void Add(Estimate entity)
    {
        // 实现Add方法...
    }

    public void Update(Estimate entity)
    {
        // 实现Update方法...
    }

    public void Delete(Estimate entity)
    {
        // 实现Delete方法...
    }

    public Estimate GetById(int id)
    {
        // 实现GetById方法...
        return null;
    }

    // 其他操作方法的实现...
}

最后,我们可以创建一个泛型类SalesTransactionRepository,实现IRepository<SalesTransaction>接口,并在其中使用IRepository<Invoice>和IRepository<Estimate>来实现具体的操作。

代码语言:csharp
复制
public class SalesTransactionRepository : IRepository<SalesTransaction>
{
    private readonly IRepository<Invoice> _invoiceRepository;
    private readonly IRepository<Estimate> _estimateRepository;

    public SalesTransactionRepository(IRepository<Invoice> invoiceRepository, IRepository<Estimate> estimateRepository)
    {
        _invoiceRepository = invoiceRepository;
        _estimateRepository = estimateRepository;
    }

    public void Add(SalesTransaction entity)
    {
        // 实现Add方法,调用_invoiceRepository和_estimateRepository的Add方法...
    }

    public void Update(SalesTransaction entity)
    {
        // 实现Update方法,调用_invoiceRepository和_estimateRepository的Update方法...
    }

    public void Delete(SalesTransaction entity)
    {
        // 实现Delete方法,调用_invoiceRepository和_estimateRepository的Delete方法...
    }

    public SalesTransaction GetById(int id)
    {
        // 实现GetById方法,调用_invoiceRepository和_estimateRepository的GetById方法...
        return null;
    }

    // 其他操作方法的实现...
}

通过这种方式,我们将IRepository<Invoice>和IRepository<Estimate>抽象为了IRepository<SalesTransaction>,并且可以在SalesTransactionRepository中使用_invoiceRepository和_estimateRepository来操作具体的实体类型。这样可以提高代码的复用性和可维护性,同时也符合面向对象设计的原则。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

.NET Core开发实战(第29课:定义仓储:使用EF Core实现仓储层)--学习笔记

29 | 定义仓储:使用EF Core实现仓储层 首先定义仓储层的接口,以及仓储层实现的基类,抽象类 仓储层的接口 namespace GeekTime.Infrastructure.Core {...; Task GetAsync(TKey id, CancellationToken cancellationToken = default); } } 具体抽象类的实现...HasMaxLength(10); }); } } } 启动程序,可以看到数据库修改结果 这说明可以在仓储层定义领域模型与数据库的映射关系,这个映射关系可以组织为一个目录...,为每一个领域模型设置一个类型来定义,并且这个过程是强类型的,这样的结构,便于后期维护 另外仓储层的话,定义了一个 IOrderRepository,仅仅实现了 IRepository 泛型接口,引进...这样一来就完成了仓储层的定义,可以看到仓储层的代码非常的薄,仅仅包含了一些接口的定义和类的继承,需要自定义一些方法的时候,可以在仓储层定义一些特殊方法,比如 AddABC 等特殊的逻辑都可以在这里去实现

2.4K11

防止在C#中滥用接口

在设计应用程序时,通常需要使用接口和抽象类。本文讨论了一些常见的“接口滥用”的例子以及我们可以用来避免它们的策略。它还讨论了“编程到接口而不是实现”这一信条的含义 什么是接口?...现在让我们来检查这两种方法之间的区别 当您对一个接口进行编程时,您使用的是最通用的抽象(接口或抽象类),而不是具体的实现。由于接口保证了一致性,因此对接口编程意味着您可以以一致的方式处理相似的对象。...这也为您的设计增加了灵活性 下面的代码片段演示了对接口的编程。考虑一个名为IRepository的接口,它包含几个方法的声明。...ProductRepository和CustomerRepository类扩展了IRepository接口并实现了在IRepository接口中声明的方法,如下所示 public interface IRepository...当您不打算有多个接口实现时使用接口就是接口过度使用的一个例子 为与类的公共成员匹配的类创建接口非常常见。

1.4K10
  • 深入理解ServiceLoader类与SPI机制

    最近我们自己在重构项目,系统为了符合82原则(希望是80%的业务能通过穷举的方式固定下来,只有20%的允许特殊的定义),那么在固定一些标准流程以后,比如我们放大了原子服务的能力,当放大原子服务能力的时候,你就会发现,虽然抽象上看做的事情是一个意思...> serviceLoader = ServiceLoader.load(IRepository.class); IteratorIRepository> it = serviceLoader.iterator...但是实际上联系待实现接口和实现接口的类之间的关系并不只是在构造ServiceLoader类的过程中完成的,而是在迭代器的方法hasNext()中实现的。...): private static final String PREFIX = "META-INF/services/"; 那么fullName会被赋值为:META-INF/services/com.vernon.test.spi.IRepository...); } throw new Error(); // This cannot happen } 总结 1、SPI的理念:通过动态加载机制实现面向接口编程,提高了框架和底层实现的分离

    49320

    ABP入门系列(3)——领域层定义仓储并实现

    在ABP中,仓储类要实现IRepository接口,接口定义了常用的增删改查以及聚合方法,其中包括同步及异步方法。主要包括以下方法: ?...在我们的应用服务层即可按以下方式使用Task仓储: public class TaskAppService : ITaskAppService { private readonly IRepository...); } return query.ToList(); } } } 该仓储实现,继承自模板生成的LearningMpaAbpRepositoryBase泛型抽象类...三、仓储的注意事项 仓储方法中,ABP自动进行数据库连接的开启和关闭。 仓储方法被调用时,数据库连接自动开启且启动事务。 当仓储方法调用另外一个仓储的方法,它们实际上共享的是同一个数据库连接和事务。...仓储对象都是暂时性的,因为IRepository接口默认继承自ITransientDependency接口。所以,仓储对象只有在需要注入的时候,才会由Ioc容器自动创建新实例。

    1K90

    Repository个人实践

    红框框起来的部分,就是关于Repository的那些部分,其中,Account.Infrustructure.Contract和Account.Infrusture.EF是核心,可以跨解决方案或工程存在...很简单,一个基于netstandard的类库,其中就两个接口定义,分别对应Repository和UoW的核心概念,IRepository的定义如下: public interface IRepository...泛型IRepository接口用来规范所有仓储都应该具有的基础增删查改方法,这里有2点需要注意: 1)方法返回类型为IQueryable,目的是延迟查询,用过类似EF的ORM的应该都知道; 2)接口有个泛型参数...这里特别说明,可能save放这里并不合适,因为有些orm犯不着必须save才行,在非事务的情况下,比如Dapper,再比如Chloe,所以这里可以更进一步优化或抽象。...这玩意儿就像ML,在XX和获得GC的大前提下,采用何种姿势,各位随意,只要自己爽就成。如果你非要尝试各种不同姿势,未尝不可,只要自己不嫌累,是不是。。。

    1K20

    UnitOfWork知多少

    该测试用例中我们添加了一个User,并为User创建对应的Customer,同时为Customer添加一条Address。...这样就形成了一条链:Uow->仓储-->聚合-->实体和值对象。即Uow负责管理仓储处理事务,仓储管理单一聚合,聚合又由实体和值对象组成。 下面我们就先来定义实体和值对象,这里我们使用层超类型。...而为了确保领域层透明的进行持久化,我们对其进行了更高一层的抽象,实现了仓储模式。...)); 这里我们限定了DbContext和UnitOfWork的生命周期为Scoped,从而确保每次请求共用同一个对象。...最后 对于Uow模式,有很多种实现方式,大多过于复杂抽象。EF和EF Core本身已经实现了Uow模式,所以在实现时,我们应避免不必要的抽象来降低系统的复杂度。

    2.4K81

    初探领域驱动设计(2)Repository在DDD中的应用

    我之前觉得IRepository和三层里面的IDAL很像,为什么要整出这么个东西来;有人说用EF的话就不需要Repository了;IRepository是鸡肋等等。...EF与Repository   在上一篇《初探领域驱动设计(1)为复杂业务而生》中,我们已经实现了一个用户注册的例子,但是并不完整。...我的答案是肯定的,这个和我们为Repository建立接口是一样的,EF中的IDbSet就是一个Repository模式,但是他们都是EF里面的东西,如果哪天我们换成NHibernate了,我们不可能为了这一个接口和基类把...现在一切都是以BLL为中心,BLL也不需要依懒于任何其它层了,作为独立的一块,我们可以更容易的进行单元测试,重构等。另外也明确了IDAL是为BLL服务的,也就是解决了我们上面提到的第二个问题。   ...但是并没有什么问题,因为在这种新的多层架构下,扩展性和可维护性同样也可以被保持的很好。 重新定义IRepository    现在,我们再回过头去看Repository。

    1.5K60

    数据访问模式之Repository模式

    数据访问层无非就是对数据进行增删改查,其中增、删、改等我们可以抽象出来写一个公共的接口或抽象类来定义这些方法,并采用一个基类实现这些方法,这样该基类派生的子类都会继承增、删、改这些方法,这样我们就避免了每个实体都要重复实现这些方法...下面我们就用EF来实现一个简单的Repository模式  1、我们对实体的公共操作部分,提取为IRepository接口,比如常见的增加,删除、修改等方法。...TEntity GetByKey(object key); } } 2、BaseEntity类 BaseEntity类中定义了所有参加数据操作实体的公共属性,因此我们把该类定义为抽象类...接口定义完毕,肯定需要一个雷来实现接口中的方法,下面我们定义一个抽象类EFRepositoryBase来实现该接口方法 我们用一个抽象类EFRepositoryBase来实现接口中的方法,这样派生的类都具有接口中定义的方法...(成绩)类,Members与Scores为一对多的关系。

    1.4K52

    Unity应用架构设计(9)——构建统一的 Repository

    谈到 『Repository』 仓储模式,第一映像就是封装了对数据的访问和持久化。...Repository 是个很抽象的概念,操作的数据也不一定要在本地,很有可能是存在远程服务器,所以也支持以Web Service的形式对数据进行访问和持久化。...定义Repository规范 Repository的规范就是接口,这个接口功能很简单,封装了数据增,删,查,改的行为: public interface IRepository where T:class...所以,在uMVVM框架中,我为了保证Repository的完整性和可读性,选择违背『里式替换原则』。...我们扩展了不同的Repository 对象来对不同的介质进行访问和持久化,这也是今后对缓存的实现做准备。 源代码托管在Github上,点击此了解

    88260

    Entity Framework Repository模式

    在数据访问层,我们可以专门的为每个类进行封装业务处理类,但是其中类与类之间相同或类似的代码段太多,对于编码人员来说,更是浪费时间,同样的代码,要在项目的不同使用地方,进行多次的复制修改几个代码字段即可使用...那么基于Rspository模式,数据访问层无非就是对数据进行增删改查,其中增、删、改等我们可以抽象出来写一个公共的接口或抽象类来定义这些方法,并采用一个基类实现这些方法,这样该基类派生的子类都会继承增...AutomaticMigrationDataLossAllowed = true; //可接受自动迁移期间的数据丢失的值 } } 2.BaseEntity类 BaseEntity类中定义了所有参加数据操作实体的公共属性,因此我们把该类定义为抽象类...我们对实体的公共操作部分,提取为IRepository接口,比如常见的增加,删除、修改等方法。...4.Repository模式中基于接口的抽象类EFRepositoryBase 我们用一个抽象类EFRepositoryBase来实现接口中的方法,这样派生的类都具有接口中定义的方法,也防止EFRepositoryBase

    1.1K10

    EF中Repository模式应用场景

    属于属于泛型编程中一个比较常用的模式,尤其应用到MVC构架中更为常见,我们来简单的介绍几个概念: 1、在《领域驱动设计:软件核心复杂性应对之道》,将Repository翻译为仓储,说明为: 一种用来封装存储,读取和查找行为的机制...二、 我们将对实体的公共操作部分,提取为IRepository接口,比如常见的也就是增删改查等方法。...如下代码: public interface IRepository where T : class { //改变模型中没有更新,里面的Save就取代更新功能...也就是实现领域模型的操作: public class Repository : IRepository where T:class { public DataContext... GetAllByDinnerId(int id); } 4、最后该实体的Repository类实现,注意要同时继承它的接口约束和Repository类,如下: public

    1.1K30

    ABP框架使用拦截器动态配置租户过滤器

    前言 最近项目要求在ABP框架中根据TenantId是否为空来配置是否禁用租户过滤器。...于是我查阅了APB AOP和拦截技术 ,另外查阅了ABP自身注册了拦截器——UnitOfWorkRegistrar,会默认为继承自IRepository或者是IApplicationService的两种类型添加...接下来就是为所需要禁用租户过滤器的类注册拦截器 public static class TenantInterceptorRegistrar { public static void Initialize...IRepository接口的所有类注册拦截器 //if (typeof(IRepository).IsAssignableFrom(implementationType))...本文版权归作者和湖南心莱信息科技有限公司共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    1.4K20

    .NET Core开发实战(第26课:工程结构概览:定义应用分层及依赖关系)--学习笔记

    microservices 共享层一共建立三个工程: 1、GeekTime.Core:主要承载基础的简单的类型,比如说异常或者一些帮助类 2、GeekTime.Domain.Abstractions:抽象层...,领域的抽象是指在领域模型可以定义一些基类或者接口,领域事件接口,领域事件处理接口,还有 Entity 的接口和 Entity 的基类 3、GeekTime.Infrastructure.Core:基础设施的核心层...基础设施层是一个独立的程序集,实现了仓储的部分,定义了一个 Order 的仓储 public interface IOrderRepository : IRepository...OrderRepository(DomainContext context) : base(context) { } } 这里可以看到仓储实际上依赖了基础设施层共享代码里面的仓储的定义 IRepository...,工程的可维护性不至于急剧的下降 Web API 是面向前端交互的接口,避免依赖领域模型 共享代码建议设计为共享包,使用私有的 NuGet 仓库来分发和管理

    52410

    ASP.NET MVC编程——单元测试

    单元测试 检验被测单元的功能,被测单元一般为低级别的组件,如一个类或类方法。 单元测试要满足四个条件:自治的,可重复的,独立的,快速的。...2准备进行单元测试 创建单元测试项目并执行测试应该依据一定的准则,运用一些技巧或工具,下面列举了常用的技巧和工具。 命名规则 测试类应以被测试的单元命名,测试方法的名称应能够描述待验证的行为。...例1:标准的3A模式,且只测试一个功能,即返回视图对象是否为null,虽然待验证的点有好几个,但我们一次只验证一个。...vr = hc.CacheExe(); //Assert Assert.IsNotNull(vr); } } 例2:验证参数为null...为能够模拟依赖,使用存储库模式。 例1:自定义模拟对象。

    2.2K50

    设计原则

    解决的办法就是,将这个大类拆为几个小类,每个类表达一个职责,譬如教育背景相关操作归为一个小类,社会兼职相关操作也归为一个小类,其他依次类推。...我们要遵循OCP原则,OCP背后的机制是抽象和多态,支持抽象和多态的关键机制是继承(比如C#是这样),那么是什么设计规则支配着这种继承用法?最佳的继承层次特征是什么?...运用的方式方法 1)基于契约编程 契约是通过为每一个方法声明前置条件和后置条件来指定的。要使一个方法得以执行,前置条件必须要为真;执行完毕后,该方法要保证后置条件为真。...运用与辨析 在web应用开发中使用仓储模式来封装对底层数据库的访问,为此创建IRepository接口: public interface IRepository {...二者都应依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。这样高层组件与低层组件之间通过抽象的接口来交换而不是具体类。该原则是框架设计的核心。 为什么要遵守此原则?

    76771

    NHibernate实践与模式

    也没有比必要再去为对数据库表的操作写任何t-sql脚本,只需要专著业务层面的开发。从而大大减少sql层的bug和开发时间,提高开发效率。...先把业务实体抽象出来,包括需要实现的功能,操作,返回的信息,通过对业务实体。...然后再去创建数据库表,和UI的部分; 我还是按在有数据表的情况下如何用NHibernate作开发 1.用MyGeneration创建实体类和mapping文件选择NHibernate lujan99 1.06...定义CRUD的接口使用了一个范性,实现这个接口的是我定义的两个IApplicationRepository,ISiteRepository两个接口,这两个只对IRepository的范性作了实现....另外如果需要对业务逻辑的抽象操作在这里扩展它的方法。     开发一个AbstractRepository实现IRepository这个接口的CRUD操作。

    81440

    如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    值对象:可以独立存在,但是无法进行自我管理,可以描述任何聚合根/实体,无生命周期的概念,也可以理解为永生(无限生命周期)。   把任何一个复杂的事物化繁为简的方式就是不断的提炼,归约。...先看下我们当前抽象出来的几个核心类。...根据本篇讲述的内容,再进行一次进行抽象。变成如下图1所示的一个关键模型。 ?...然后我们的IRepository变成下面这样约束: public interface IRepository where T : DelegateIdentifier, IAloneStorable...六、结语 从业务角度来说设计就是不断的梳理业务再抽象建模的过程,不是一蹴而就,也没有一招打遍天下的方式。需要不断的演进、找到最适合的设计方式。

    80030
    领券