返回对象的IRepository混淆

时间:2009-02-07 21:13:29

标签: asp.net repository-pattern irepository

我有一些经常使用的电子商务代码,它使用Linq To SQL将订单保存到数据库。我想删除紧密耦合的Linq to SQL位并传入IRepository,但我仍然对事情感到困惑。

假设我的ICustomerRepository上有一个GetCustomer()方法,它返回一个Customer对象。

我是否需要它来真正返回从该方法传回的ICustomer对象,所以如果我从Linq To SQL切换到说SubSonic它不是问题?

我相信我这样做,如果是这样的话,Linq To SQL是否有办法轻松地将我的Linq To SQL Customer对象转换为我的ICustomer对象,如SubSonics ExecuteSingle(Of)方法?

3 个答案:

答案 0 :(得分:3)

如果您希望Customer类是一个没有LINQ附件的普通对象,那么您很可能需要编写一个mapper方法来将基于LINQ的Customer对象转换为普通的Customer域对象。 LINQ to SQL没有内置的此类功能。

为了便于阅读,我已经开始将我的映射方法包装在扩展方法中,这确实有助于保持Repository代码的简单性。例如,我的示例CustomerRepository方法如下:

public Customer GetById(int id)
{
   return dataContext.LINQCustomers.Where(c => c.Id == id)
                                   .Single()
                                   .ToDomainObject();
}

和ToDomainObject()方法在扩展方法中定义,如:

public static class ObjectMapper
{
    public static Customer ToDomainObject(this Customer linqObject)
    {
        var domainObject = null
        if (linqObject != null)
        {
            domainObject = new Customer
            {
               Id = linqObject.Id,
               FirstName = linqObject.FirstName,
               LastName = linqObject.LastName
            }
        }
        return domainObject;
    }
}

或类似的东西。您可以这样做,将域对象转换回LINQ对象,以传回存储库以实现持久性。

答案 1 :(得分:1)

只要Customer是一个普通的旧.NET对象,而不是某个db生成的实体,就可以让它返回一个Customer。您的客户域对象应该不知道如何(或者如果)它可以持久保存到数据库,这应该是从您的存储库返回的内容。在您的存储库中,您可能有一些映射代码 - 这很常见 - 从[从您的存储位置获取数据]到您的域对象的映射。如果您正在使用Linq-to-sql,则此映射将来自Linq-To-Sql生成的Customer表(可能还有其他表 - 您的Customer域对象可能不会将1:1映射到数据库中的特定表)您的客户域对象,它将位于不同的命名空间(很可能是组件)。

答案 2 :(得分:1)

根本没有必要让它成为一个ICustomer。存储库的作用方式使其看起来好像您的持久化实例位于内存中。

public interface ICustomerRepository
{
  Customer GetByID(int id);
  IEnumerable<Customer> GetByName(string name);
  Customer GetByVatCode(string vatCode);
}

有些人还会包括诸如

之类的方法
void Add(Customer newCustomer);
void Delete(Customer deleted);
void Update(Customer modified);

后一种方法实现很可能只是更新一个工作单元。

虽然这些概念只是询问客户实例的常用方式,但存储库可以作为一种询问它们的方式,而无需定义如何来询问它们。