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 へのインターフェイスを作成する方法がよくわかりません (サブクラスとすべてを使用)。これは可能ですか?

どうすればいいですか?

4

1 に答える 1

0

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 ではインターフェイスでネストされた型が許可されていることに注意してください)。この方法でコントラクトを指定したい場合は、インターフェイスの代わりに実装なしで抽象クラスを使用できますが、これにより継承の問題が発生します。

于 2011-01-09T21:56:03.153 に答える