2009-01-15 55 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的存儲庫。

相關問題