2009-01-15 50 views
3

在不使用LINQ或其他ORM的情况下使用Repository模式是否有意义?我在MONO中编写应用程序并使用MySQL,正在考虑使用repositoy模式,但无法处理IQueryable。我正在考虑在存储库中公开更多方法,以明确在数据库调用时将在db侧进行过滤。任何建议,如果这是对设计或任何其他设计理念的有效使用,而不是?没有LINQ或其他ORM的存储库模式?

回答

3

版本库与IQueryable完全没有关系。你在想的是Rob Conory .net 3.5采用的存储库模式,实际上它更像是数据代理模式。

存储库负责返回对象,并负责处理数据访问,以便应用程序的其余部分可以不知道它。

你可以看到Martin Fowlers网站

+0

你对所有这些都是正确的。我指的是Robs post,已经发布了所有的地方,只是想知道是否要在db中进行过滤,并返回这个模式的有效用法,尽管这并不理想。 – CSharpAtl 2009-01-15 13:27:33

0

这是绝对有可能的一个非常高的水平的描述。但是您应该将查询移动到存储库网站并为每个类实施一个存储库。例如:

public abstract class GenericRepository : IRepository { 
    public virtual T Get<T>(Identity id) where T : PersistentDocument { 
     using (IDbConnection connection = GetConnection()) 
     using(IDbCommand command = CreateGetCommand(id, connection)) { 
      using (IDataReader reader = command.ExecuteReader()) { 
       var mapper = DaHelper.GetMapper<T>(); 
       return mapper.Map(reader); 
      } 
     } 
    } 

    protected virtual IDbCommand CreateGetCommand(Identity id, IDbConnection connection) { 
     IDbCommand command = connection.CreateCommand(); 
     command.CommandText = String.Format("SELECT * FROM {0} e WHERE e.id = ?", TableName); 
     command.Parameters.Add(id.ToGuid()); 
     return command; 
    } 

    protected abstract string TableName { get; } 
} 

public class UserRepository: GenericRepository<User>, IUserRepository 
{ 
    protected override string TableName { get { return "users"; } } 

    public User GetByEmail(string email) 
    { 
     using (IDbConnection connection = GetConnection()) 
     using (IDbCommand command = connection.CreateCommand()) 
     { 
      command.CommandText = String.Format("SELECT * FROM {0} e WHERE e.email = ?", TableName); 
      command.Parameters.Add(email); 
      using (var reader = command.ExecuteReader()) 
       return DaHelper.GetMapper<T>().Map(reader); 
     } 
    } 
} 
0

当然。存储库只是linq使用的一种模式。您可以通过它提供您想要的任何类型的数据访问。我工作的一个项目使用处理强类型DataSet的存储库。

相关问题