Интерфейсы и шаблоны дизайна фасадов - PullRequest
0 голосов
/ 10 января 2011

Я использовал шаблон проектирования фасада, чтобы сгруппировать все административные функции, которые мне нужны в моей программе.

в моей библиотеке классов 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, и я пытаюсь выяснить, как продолжить доступ к моему AdminRepository (ранее AdminFactory) из службы WCF.

Чтобы получить доступ, я включил интерфейсы в мои классы репозитория в моей доменной логике.Тем не менее, я не совсем уверен, как идти о создании интерфейса для фасада, такого как у меня (с подклассами и все).Это возможно?

Как мне это сделать?

1 Ответ

1 голос
/ 10 января 2011

Я не совсем понимаю, почему вы хотите создать интерфейс для 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 допускает вложенные типы в интерфейсах). Если вы хотите указать контракты таким образом, вы можете использовать абстрактные классы без реализации вместо интерфейса, но это создает проблемы наследования.

...