C# 可以从POCO调用数据层/repo吗?

C# 可以从POCO调用数据层/repo吗?,c#,asp.net,architecture,poco,C#,Asp.net,Architecture,Poco,我正试图弄清楚如何为我的购物车建立一个干净的架构,而不过度设计它或以一个贫乏的域模型结束。现在我只想使用标准的ADO数据库逻辑,而不使用任何ORM框架。我也在学习EF4.1,但还不足以用于生产 理想情况下,我只需要为每个业务对象/实体提供一个POCO和一个将处理持久性的存储库/数据类。为了简单起见,我正在考虑将POCO与数据层紧密耦合,它将返回POCO。如果我也将DTO添加到混合中,那么每个区域的gc、订单、项目、付款等都会有5-6个类文件,这对于一个简单的应用程序来说似乎太多了。我以后总能改进

我正试图弄清楚如何为我的购物车建立一个干净的架构,而不过度设计它或以一个贫乏的域模型结束。现在我只想使用标准的ADO数据库逻辑,而不使用任何ORM框架。我也在学习EF4.1,但还不足以用于生产

理想情况下,我只需要为每个业务对象/实体提供一个POCO和一个将处理持久性的存储库/数据类。为了简单起见,我正在考虑将POCO与数据层紧密耦合,它将返回POCO。如果我也将DTO添加到混合中,那么每个区域的gc、订单、项目、付款等都会有5-6个类文件,这对于一个简单的应用程序来说似乎太多了。我以后总能改进

我正在上的第一堂课是礼品券。其中一种方法是创建一个新的GC。在这个方法中,我需要查询数据库,以确保新代码在系统中不存在。在这个方法中调用数据层/repo可以吗

数据层/回购是否应该是静态的?我应该只通过POCO本身暴露它吗

我是否应该完全删除数据层,直接使用POCOs活动记录样式进行数据调用

我需要一个简单的架构,它允许我在不使事情过于复杂的情况下分离关注点。数据库提供程序和表结构至少在未来几年内不会改变

下面是一些代码。。只需要找出零件的去向

public GiftCertificateModel
{
    public int GiftCerticiateId {get;set;}
    public string Code {get;set;}
    public decimal Amount {get;set;}
    public DateTime ExpirationDate {get;set;}

    public void Redeem(string code, decimal amount)
    {
        //need to validate the input
        //need to insert a record to the transaction log table (call the repo or does this entire method need to be in the repo?)
    }

    public void GetNewCode()
    {
        //need to create random alpha num code
        //need to make sure the code is unique in the db... (again, (call the repo or does this entire method need to be in the repo?
    }

}




public GiftCertificateRepo : DALBase (DALBase has methods for connecting, etc)
{

    //mapping code here to map SQLDataReader values to GiftCertificateModel properties
    //i can also setup separate DTOs if it makes more sense...

    //should the repo be static?
    public static GiftCertificateModel GetById(int GiftCertificateId)
    {
        //call db to get one and return single model

    }

    public static bool IsUnique(string code)
    {
        //call db to see if any records exists for code

    }

    public static List<GiftCertificateModel> GetMany()
    {
        //call db to get many and return list

    }

    public static void Save(GiftCertificateModel gc)
    {
        //call db to save

    }
}

根据定义,POCO是不知道持久性的,也就是说,它不知道这一点以及它是如何被持久化的


如果您将业务对象与存储库或持久性层相耦合,这可能完全可以根据您的情况而定,但不再是POCO了。

有几种系统/思想,但他们都同意持久性不是业务类的一部分。为存储和检索POCO创建一个单独的数据访问层。

通过将POCO的数据表示形式与存储库对象的数据存储/检索方式表示形式分开,将来您将能够更轻松地从ADO切换到更高级的ORM系统-这些代码更改将被隔离到一个地方


更好的是,定义一个IRepository接口并让您的ADO repository类实现它。然后,你的应用程序应该只与IRepository一起使用,这样以后就更容易测试或切换存储库实现。

请不要给你的GC一个Collect方法。你不能在DB级别创建新代码吗?在我的应用程序中,我通常在保存新记录之前在存储的进程中创建一个新的guid。根据我所读的,您应该有一个丰富的域模型,因此我假设在POCO中有验证和其他业务逻辑是可以的,否则它只是一个DTO/贫血模型。因此,当创建一个新的GC时,需要对照db检查代码,看看它是否唯一。。。我该怎么处理呢?@developr-请看我的评论below@RobertLevy-我只是不太清楚如何将存储库模式应用到我的解决方案中。@developr-我将替换这个:GiftCertificateModel gc=new GiftCertificateModel;gc.Code=gc.GetNewCode;使用GiftCertificateModel gc=gcRepo.CreateNew;然后repo负责创建gc对象并为其提供有效的code@Robert利维-谢谢你的建议。所以我只需将参数exp date、amount等传递给repo方法?那么,回购协议中是否也会进行输入验证?如果是这样,那么poco中会包含哪些类型的丰富功能?@developr-validation可以包含在模型中。我不会将这些参数传递给CreateNew方法,您可以在获取对象后设置这些属性。但是,让CreateNew做一些特定于存储库的工作,以确保新代码具有良好的、独特的代码GCs@RobertLevy-只是澄清一下,在存储库之外创建gc对象可以吗?而且,据我所知,无论出于什么原因,都不应该在POCO中调用回购协议?只要POCO不知道持久层,那么如果持久层本身可以接受/返回POCO,那会有什么区别?也许我误解了你的问题。我以为你想在你的POCO中包含持久性调用,那么它就不再是POCO了。我应该如何处理我的POCO中需要获取数据来计算属性或检查存在性的情况?如果这些是独立的服务类,例如-需要查看GC代码是否唯一,如果不是,则应该给出一个新代码。在codebehind文件中使用这种逻辑似乎很愚蠢。我要么使用服务类进行编排,要么使用依赖项注入将存储库移交给业务对象。目前,DI有点让我不知所措。顺便问一句,你建议转向EF还是?
GiftCertificateModel gc = new GiftCertificateModel();
gc.Code = gc.GetNewCode(); //do i call the is unique here or in the GetNewCode method?
gc.Amount = 10;
gc.ExpirationDate = "1/1/2012";
GiftCertificateRepo.Save(gc);