我一直在使用门面设计模式将所有管理组合在一起 我在程序中需要的功能。
在我的类库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接口,例如我拥有的接口(带有子类和所有接口)。这可能吗?
我该怎么做?
答案 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确实允许接口中的嵌套类型)。如果您希望以这种方式指定合同,则可以使用抽象类而不使用实现而不是接口,但这会产生继承问题。