2011-01-09 5 views
0

Ich habe ein Fassadenmuster verwendet, um alle administrativen Funktionen in meinem Programm zusammenzufassen.Schnittstellen und Fassaden Design Patterns

in meiner Klassenbibliothek Company.Infrastructure.Repositories.Administration ich habe:

[Pluggable("Default")] 
    public class AdminRepository : IAdminRepository 
    { 

    #region private members 
    #endregion 

    #region protected members 
     protected Membership _membership; 
     protected Permissions _permissions; 
     protected Application _application; 
     protected Profile _profile; 
    #endregion 

     public AdminRepository() 
     { 
      _membership = new Membership(); 
      _permissions = new Permissions(); 
      _application = new Application(); 
      _profile = new Profile(); 
     } 

     protected class Profile 
     { 
      public Profile() {} 

      public void ProfileMethod1(){} 
      public void ProfileMethod2(){}  
     } 

     protected class Membership 
     { 
      public Membership() {} 
       public User GetUser(Guid id) 
     { 
      using (var dc = new My_SdbDataContext()) 
      { 
       var user = dc.aspnet_Users.Where(x => x.UserId == id).FirstOrDefault(); 
       var membership = dc.aspnet_Memberships.Where(x => x.UserId == id).FirstOrDefault(); 

       return Convert.ToEntity(user, membership); 

      } 
     } 

     public User GetUser(string userName) 
     { 
      using (var dc = new My_SdbDataContext()) 
      { 
       var user = dc.aspnet_Users.Where(x => x.UserName == userName).FirstOrDefault(); 
       var membership = dc.aspnet_Memberships.Where(x => x.UserId == user.UserId).FirstOrDefault(); 


       return Convert.ToEntity(user, membership); 

      } 
     } 

     public IEnumerable<User> GetUsers(Guid applicationId) 
     { 
      var userList = new List<User>(); 

      using (var dc = new My_SdbDataContext()) 
      { 
       var users = dc.aspnet_Users.Where(x => x.ApplicationId == applicationId).ToList<aspnet_User>(); 

       userList.AddRange((IEnumerable<User>) (from user in users 
               let membership = dc.aspnet_Memberships.Where(x => x.UserId == user.UserId).FirstOrDefault() 
               select Convert.ToEntity(user, membership))); 
      } 

      return userList; 
     } 
     } 

     etc... 


} 

Das ist für mich gut funktioniert hat. Wir sind jedoch zu einem DDD-Modell übergegangen und versuchen herauszufinden, wie ich weiterhin von einem WCF-Dienst auf mein AdminRepository (ehemals AdminFactory) zugreifen kann.

Um Zugriff zu erhalten, habe ich die Schnittstellen zu meinen Repository-Klassen in meiner Domain-Logik enthalten. Ich bin mir jedoch nicht ganz sicher, wie ich eine Schnittstelle zu einer Fassade erstellen soll, so wie die, die ich habe (mit Unterklassen und allen). Ist das möglich?

Wie mache ich das?

Antwort

1

Ich bin verwirrt, warum Sie eine Schnittstelle zu Ihrem AdminRepository erstellen möchten, die geschachtelte Klassen enthält. Basierend auf Ihrem Code, würde ich denken, Sie

public interface IAdminRepository 
{ 
    bool MemberHasPermission(int id) 
    //and so on - you didn't provide any methods, so I'm making one up 
    // ... 
} 

An dieser Stelle haben würden, Ihr IAdminRepository gibt den Auftrag, warum auch den Vertrag über die Implementierung angeben (in Ihrem Fall verschachtelte Klassen geschützt)? Beachten Sie, dass dies nicht bedeutet, dass ich Ihre Verwendung der geschützten verschachtelten Klassen verstehe, oder warum Sie es das "Fassadenmuster" nennen, wenn alle abstrahierten Komponenten tatsächlich interne Implementierungen sind, oder warum Sie auf ein DDD-Modell umsteigen sollten macht den Zugriff auf Ihr Repository von WCF schwierig. Ich sehe allerdings nicht, warum Sie versuchen würden, geschachtelte Klassen in einer Schnittstelle anzugeben, aber C# lässt es in keinem Fall zu (beachten Sie, dass VB verschachtelte Typen in Schnittstellen zulässt). Wenn Sie auf diese Weise Verträge angeben möchten, können Sie anstelle einer Schnittstelle abstrakte Klassen ohne Implementierung verwenden, was jedoch zu Problemen bei der Vererbung führt.