2011-01-09 7 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)に引き続きアクセスする方法を理解しようとしています。

私はアクセスを実現するために、自分のドメインロジックに自分のリポジトリクラスへのインターフェイスを含めています。しかし、私は(サブクラスとすべてで)持っているもののようなファサードへのインタフェースを作成する方法についてはあまりよく分かりません。これは可能ですか?

どうすればよいですか?

答えて

1

ネストされたクラスを含むAdminRepositoryへのインターフェイスを作成する理由は混乱しています。あなたのコードに基づいて、私はあなたがこの時点で

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

を持っていると思うだろう、あなたのIAdminRepositoryが契約を指定し、なぜ契約には、(あなたのケースでは、ネストされたクラスを保護)の実装を指定するのでしょうか?

これは、保護されたネストされたクラスの使用法を理解していること、または抽象化されたすべてのコンポーネントが実際に内部実装されているか、またはDDDモデルに移動する理由を「ファサードパターン」 WCFからあなたのリポジトリにアクセスするのを難しくします。しかし、なぜインターフェイスでネストされたクラスを指定しようとしているのかは確かに分かりませんが、C#ではそれが許されません(VBではインターフェイスのネストされた型を許可します)。このように契約を指定する場合は、インタフェースではなく実装なしで抽象クラスを使用できますが、継承の問題が発生します。

関連する問題