2011-01-09 3 views
0

나는 내 디자인 프로그램에서 필요한 모든 기능을 그룹으로 묶기 위해 외관 디자인 패턴을 사용하고 있습니다. 내 클래스 라이브러리 Company.Infrastructure.Repositories.Administration에서인터페이스 및 외관 디자인 패턴

내가 가진이 잘 나를 위해 일했다

[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... 


} 

. 그러나 우리는 DDD 모델로 이동했으며 WCF 서비스에서 AdminRepository (이전의 AdminFactory)에 계속 액세스하는 방법을 알아 내려고합니다.

액세스를 달성하기 위해 내 도메인 논리에 인터페이스를 리포지토리 클래스에 포함했습니다. 그러나, 내가 가진 것과 같은 Facade에 대한 인터페이스를 만드는 방법 (서브 클래스와 전체)에 대해서는 어떻게 확신 할 수 없는지 잘 모르겠습니다. 이것이 가능한가?

어떻게하면됩니까?

답변

1

중첩 된 클래스가 포함 된 AdminRepository에 대한 인터페이스를 만드는 이유가 무엇인지 혼란 스럽습니다. 코드를 기반으로, 나는 당신의 IAdminRepository 계약, 왜 계약도 (귀하의 경우 중첩 된 클래스를 보호) 구현을 지정합니다를 지정,이 시점에서

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

있을 것입니다 생각?

이것이 보호 된 중첩 클래스의 사용법을 이해했거나 추상화 된 모든 구성 요소가 실제로 내부 구현이거나 DDD 모델로 이동하는 이유를 "외관 패턴"이라고 부르는 이유는 아닙니다. WCF에서 저장소에 액세스하는 것을 어렵게 만듭니다. 그러나 확실히 인터페이스에서 중첩 된 클래스를 지정하려고하는 이유는 모르겠지만 C#에서는 어떤 경우에도 허용하지 않습니다. VB에서는 인터페이스에서 중첩 된 형식을 허용합니다. 이 방법으로 계약을 지정하려면 인터페이스 대신 구현없이 추상 클래스를 사용할 수 있지만 상속 문제가 발생합니다.