我有一个数据访问对象库,我的任务是设计逻辑层。在这一层中,我可以访问核心数据模型,我需要使用它来创建可以传递给UI进行渲染的Profile
个对象。
数据模型中需要等效Profile
对象的每个对象都来自类型Page
。理想情况下,我需要编写一个接受Page作为参数并返回Profile的方法。然而,这并不是那么简单,因为Profile
个对象被分成了一组用户可以启用的应用程序。
我尝试了各种不同的方法(并继续删除整个批次并重新开始!),但这是我正在尝试的解决方案:
public interface IApp
{
//should be static, but interfaces cannot define static properties
//so this instance property will return a private static field
Dictionary<Type, IProfileCreator> Profiles { get; }
//other things the App contains that isn't relevant to the profiles
}
public interface IProfile
{
Page page { get; set; }
}
public interface IProfileCreator
{
IProfile Create(Page page);
}
public class ProfileCreator<TProfile> where TProfile : IProfile, new()
{
IProfile IProfileCreator.Create(Page page)
{
return Create(page);
}
public TProfile Create(Page page)
{
//constructor will have to be blank because of the new() constraint
TProfile profile = new TProfile();
profile.Page = page;
return profile;
}
}
我必须为不同的页面创建24个相当大的Profile
类,所以我只想确保在开始编码之前我以最好的方式做到这一点。正如您所看到的,这种设计存在一些缺陷,但有没有更好的方法呢?有没有人尝试过类似的事情(这种情况不是那么罕见,可以吗?)
答案 0 :(得分:2)
看看这个Factoy PAttern(source):
abstract class ProfileFactory
{
public abstract IProfile GetProfile(Page p); //Factory Method Declaration
}
class concreteFactoryforProfile1 : ProfileFactory
{
public override IProfile GetProfile(Page p) //Factory Method Implementation
{
//data access stuff...
return new Profile() { Page = p };
}
}
class concreteFactoryforProfile2 : ProfileFactory
{
public override IProfile GetProfile(Page p) //Factory Method Implementation
{
//other data access stuff...
return new Profile() { Page = p };
}
}
interface IProfile
{
Page Page { get; set; }
//other properties can come here
}
class Profile : IProfile
{
public Page Page { get; set; }
//other properties can come here
}
public class Test
{
void Main()
{
ProfileFactory[] objFactories = new ProfileFactory[2];
objFactories[0] = new concreteFactoryforProfile1();
objFactories[1] = new concreteFactoryforProfile2();
foreach (ProfileFactory objFactory in objFactories)
{
IProfile objProfile = objFactory.GetProfile(this.Page);
Page p = objProfile.Page;
}
}
}
然后两个App可能具有相同类型的Object,您创建对象的实现只会执行一次。
如果您需要更多详细信息,请询问。