我想知道如何处理C#中的依赖属性。我有以下简化类(我正在使用DevExpress XAF):
public class Company
{
public ContactMethods? PreferredContactMethod { get; set; }
// Missing: Collection of Employees...
}
public class Employee
{
private Company company;
public Company Company
{
get
{
return this.company;
}
set
{
company = value;
if (company != null && PreferredContactMethod == null)
{
PreferredContactMethod = company.PreferredContactMethod;
}
}
}
public ContactMethods? PreferredContactMethod { get; set; }
}
将公司分配给员工时,我将Employee.PreferredContactMethod设置为公司的PreferredContactMethod(为方便起见,以后可以更改)。
我想在初始化新员工时使用Company.PreferredContactMethod作为默认值。每个员工都独立于公司存储自己的ContactMethod。以后对Company.PreferredContactMethod的更改不应更新Employee.PreferredContactMethod。 Employee.PreferredContactMethod为null是完全合法的(例如,如果显式设置为user)。
非常简单的代码,当然这只是工作正常。但我认为这违反了Microsoft's Property Design Guidelines:
允许以任何顺序设置属性,即使这会导致a 暂时无效的对象状态。
Company = A, PreferredContactMethod = null
提供的结果不是PreferredContactMethod = null, Company = A
。
我认为我不能依赖属性设置者的'正确'顺序(例如,如果使用Automapper / Reflection),你如何应对这种情况?我认为这并不罕见。
谢谢!
答案 0 :(得分:0)
您希望确保员工与本公司本人具有相同的PreferredContactMethod的不变量,除非他自己有指定的PreferredContancMethod。扩展解决方案的一种方法是实现这一点,就像这样更新这个值:
public class Employee
{
private Company company;
public Company Company
{
get { return this.company; }
set
{
this.company = value;
UpdateCompanyPreferredContactMethod();
}
}
private ContactMethods? preferredContactMethod;
public ContactMethods? PreferredContactMethod
{
get { return this.preferredContactMethod; }
set
{
this.preferredContactMethod = value;
UpdateCompanyPreferredContactMethod();
}
}
private void UpdateCompanyPreferredContactMethod()
{
if (PreferredContactMethod == null)
{
PreferredContactMethod = company != null ?company.PreferredContactMethod : null;
}
}
}
但是,此解决方案很脆弱,因为每次更改时都必须更新此值。相反,我实际上会做这样的事情:
public class Employee
{
public Company Company { get; set; }
private ContactMethods? preferredContactMethod;
public ContactMethods? PreferredContactMethod
{
get
{
if (this.preferredContactMethod != null)
{
return this.preferredContactMethod;
}
else if (this.Company != null)
{
return this.Company.PreferredContactMethod;
}
else
{
return null;
}
}
set { this.preferredContactMethod = value; }
}
}
答案 1 :(得分:0)
您说您希望在初始化新员工时使用PreferredContactMethod作为默认值。如果是这种情况,您应该将公司传递给Employee的构造函数,然后设置它:
public Employee(Company company) {
// Null checks as appropriate
this.company = company;
this.PreferredContactMethod = company.PreferredContactMethod;
}
如果您还想以您的方式更改PreferredContactMethod,并且您唯一的担心是违反设计指南,那么可以使用方法Employee.SetCompany
来指示操作除了更改之外还有副作用Company
财产。
答案 2 :(得分:0)
我认为您需要在保存Employee对象之前分配它,因此任何顺序都会产生相同的结果。
试试这个;
if (IsNewRecord && Company != null && PreferredContactMethod == null)
PreferredContactMethod = Company.PreferredContactMethod;