2012-04-09 33 views
0

我已經創建了一個服務數據訪問層,其中有數據需要來自多個數據庫。如何正確實施具有兩個界面的戰略模式?

我在一個數據庫中做得很好,我在其中定義了包含成員詳細信息的memberRepository。但是,現在我必須獲取存儲在另一個數據庫中的與會話相關的詳細信息。

OprationContracts:

  • IMemberServices包含GetLoggedInBuddies(int profileID);
  • ISessionServices包含GetProfileIDFromSessionID(string sessionID);

我的服務類:

public class MemberService : IMemberService, ISessionServices 
{ 
    #region Strategy pattern configuration 

    // 
    // Member repo 
    // 
    private MemberRepository memberRepository; 
    public MemberService() 
     : this(new MemberRepository()) 
    { } 
    public MemberService(MemberRepository memberRepository) 
    { 
     this.memberRepository = memberRepository; 
    } 


    // 
    // Session repo 
    // 
    private SessionRepository sessionRepository; 
    public MemberService() : this(new SessionRepository()){} 
    public MemberService(SessionRepository sessionRepository) 
    { 
     this.sessionRepository = sessionRepository; 
    } 

    #endregion 



    /// <summary> 
    /// Session-related details are maintained in the Secondary database 
    /// </summary> 
    /// <param name="sessionID"></param> 
    /// <returns></returns> 
    public int GetProfileIDFromSessionID(string sessionID) 
    { 
     int sessionProfileID = sessionRepository.GetProfileDetailsFromSessionID(sessionRepository); 

     return sessionProfileID; 
    } 

    /// <summary> 
    /// Try profileID = 1150526 
    /// </summary> 
    /// <param name="profileID"></param> 
    public void GetLoggedInBuddies(int profileID) 
    { 
     memberRepository.GetLoggedInBuddies(profileID); 
     //return memberRepository.GetLoggedInBuddies(profileID); 
    } 

的問題是,在// Session Repo部分,因爲我已經定義了一個構造函數。我明白了。

所以在每個方法基本上我想要做這樣的事情

MemberService useSessionRepo = new MemberService(SessionRepository); 
useSessionRepo.GetProfileDetailsFromSessionID(...); 

MemberService useMemberRepo = new MemberService(MemberRepository); 
useMemberRepo.GetLoggedInBuddies(...); 

只需要一隻手放在了一起。

謝謝。

回答

0

我創建了一箇中央存儲庫,它接受我想連接的數據庫連接字符串的名稱。

public abstract class DatabaseRepository : BaseRepository 
{ 
    static IDbConnection connection; 

    /// <summary> 
    /// Handles db connectivity as Dapper assumes an existing connection for all functions 
    /// Since this app uses three databases, pass in the connection string for the required db. 
    /// </summary> 
    /// <returns></returns> 
    protected static IDbConnection OpenConnection(string connectionStringName) 
    { 
     try 
     { 
      connection = new SqlConnection(WebConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString); 
      //connection = SqlMapperUtil.GetOpenConnection(connectionStringName);  // if we want to use the Dapper utility methods 
      connection.Open(); 
      return connection; 
     } 
     catch (Exception ex) 
     { 
      ErrorLogging.Instance.Fatal(ex);  // uses singleton for logging 
      return null; 
     } 
    } 
. 
. 
. 

然後在我的服務庫,我做出適當的數據庫連接並執行我所需要的任何查詢:

using (IDbConnection connection = OpenConnection("FirstDBConnectionString")) { ... 
+0

它是一個答案或問題?如果它是答案,則標記它。 – AlexT 2012-04-28 09:32:04

0

我不確定你的問題,但你可以使用沒有參數的ctor和每個repo的參數。

public MemberService() 
{ 
    this.memberRepository = new MemberRepository(); 
    this.sessionRepository = new SessionRepository(); 
}