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 回答