根据封装对象的类型初始化派生类

时间:2011-07-26 09:26:43

标签: c# software-design

我有一个数据访问对象库,我的任务是设计逻辑层。在这一层中,我可以访问核心数据模型,我需要使用它来创建可以传递给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类,所以我只想确保在开始编码之前我以最好的方式做到这一点。正如您所看到的,这种设计存在一些缺陷,但有没有更好的方法呢?有没有人尝试过类似的事情(这种情况不是那么罕见,可以吗?)

1 个答案:

答案 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,您创建对象的实现只会执行一次。

如果您需要更多详细信息,请询问。