我的问题与this question有关,但更为具体。

我有一个看起来像这样的域对象Customer:

public class Customer : Party
{
    public Identity Identity {get; protected set;}
    public bool IsOrganization {get; set;}
}

身份看起来像这样:
public class Identity : PersistableModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string MiddleInitial { get; set; }
    public string Title { get; set; }
    public string BusinessName { get; set; }
    public string LegalName { get; set; }
    public bool IsSynchronized { get; private set; }
}

public abstract class PersistableModel : IPersistableModel
{
    public const long UnassignedId = 0;
    public static readonly DateTime MinimumDateTime = new DateTime(1900, 1, 1);

    private readonly List<string> modifiedProperties = new List<string>();
    public virtual ModelState State { get; set; }
    public IEnumerable<string> ModifiedProperties { get { return modifiedProperties; } }
    protected bool HasModifiedProperties { get { return 0 < modifiedProperties.Count; } }
    public bool WasModified(string propertyName)
    {
        return modifiedProperties.Contains(propertyName);
    }
    public void WasModified(string propertyName, bool modified)
    {
        if (modified)
        {
            if (!WasModified(propertyName)) modifiedProperties.Add(propertyName);
        }
        else
        {
            modifiedProperties.Remove(propertyName);
        }
    }

    public virtual void OnPersisting()
    {
    }

    public abstract void Accept(Breadcrumb breadcrumb, IModelVisitor visitor);
}

现在,基于IsOrganization的值,需要更改Identity中的某些逻辑,特别是如果IsOrganization为true,则与个人相关的字段(名字,姓氏等)需要返回null,如果为false,则Organization字段需要返回null。

以前,这是通过具有不同实现方式的客户来完成的,这些实现会将身份初始化为其构造函数中的不同基类,但是我正在进行的更改需要消除这两种客户类型的类分离。

我当时想让Identity属性看起来像这样:
public override Identity Identity
{
    get
    {
         if (IsOrganization)
         {
             return OrgnaizationIdentity.FromIdentity(base.Identity);
         }
         else
         {
             return IndividualIdentity.FromIdentity(base.Identity);
         }
     }
 }

“从身份”方法如下所示:
public static OrgnaizationIdentity FromIdentity(Identity identity)
{
    return new OrgnaizationIdentity
    {
        FirstName = identity.FirstName,
        LastName = identity.LastName,
        MiddleNameInitial = identity.MiddleNameInitial,
        Title = identity.Title
    };
}

这里的问题是原始身份对象具有一些私有(private)字段,这些私有(private)字段也需要返回。

所以我的问题是,做这样的事情是否被接受?

最佳答案

如果可以添加并使用一个复制构造函数,则可以执行此操作:

class Identity
{
    private int x;
    public Identity(Identity that)
    {
        this.x = that.x;
    }
}

class OrgnaizationIdentity : Identity
{
    public OrgnaizationIdentity(Identity that) : base(that) { ... }
}

10-07 12:29
查看更多