2012-04-09 9 views
0

Ich habe eine Service Data Access Layer erstellt, wo es mehrere Datenbanken gibt, wo Daten herkommen müssen.Wie kann man das Strategy Pattern mit zwei Schnittstellen richtig implementieren?

Mir ging es gut mit einer Datenbank, in der ich die memberRepository definierte, die Elementdetails enthielt. Jetzt muss ich jedoch sessionbezogene Details abrufen, die in einer anderen Datenbank gespeichert sind.

OprationContracts:

  • IMemberServices enthält GetLoggedInBuddies(int profileID);
  • ISessionServices enthält GetProfileIDFromSessionID(string sessionID);

Mein Serviceklasse:

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); 
    } 

Das Problem ist, dass in den // Session Repo Abschnitt, da ich bereits einen Konstruktor definiert habe. Ich verstehe das.

Also im Grunde in jeder Methode mag ich wie etwas tun müssen,

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

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

Nur eine Hand dieses zusammen setzen.

Danke.

Antwort

0

Ich habe ein zentrales Repository erstellt, das den Namen der Verbindungszeichenfolge der Datenbank akzeptiert, mit der ich eine Verbindung herstellen möchte.

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; 
     } 
    } 
. 
. 
. 

Dann in meiner Dienstbibliothek, mache ich die Verbindung zum entsprechenden db und ausführen, was Abfragen ich brauche:

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

Ist es eine Antwort oder Frage? Markiere es, wenn es antwortet. – AlexT

0

Ich bin mir nicht sicher über Ihr Problem, aber Sie können ein ctor ohne param und mit param für jedes Repo verwenden.

Verwandte Themen