接口和外观设计模式

时间:2011-01-09 21:28:09

标签: c# design-patterns interface facade

我一直在使用门面设计模式将所有管理组合在一起 我在程序中需要的功能。

在我的类库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)。

为了实现访问,我在Domain逻辑中将Interfaces包含到我的Repository类中。但是,我不太确定如何创建一个Facade接口,例如我拥有的接口(带有子类和所有接口)。这可能吗?

我该怎么做?

1 个答案:

答案 0 :(得分: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模型时将其称为“Facade模式”的原因很难从WCF访问您的存储库。但是,我当然不明白为什么你要尝试在接口中指定嵌套类,但c#在任何情况下都不允许它(注意VB确实允许接口中的嵌套类型)。如果您希望以这种方式指定合同,则可以使用抽象类而不使用实现而不是接口,但这会产生继承问题。