C# 数据服务返回对象时的类组合问题
在一个项目中,我有以下的班级关系<代码>员工和客户与C# 数据服务返回对象时的类组合问题,c#,.net,uml,mvp,composition,C#,.net,Uml,Mvp,Composition,在一个项目中,我有以下的班级关系员工和客户与公司有组合关系。因此,实现如下 class Company { private Employee _Employee {get;set;} // private fields as composition private Client _Client {get;set;} public Company() { _Employee = new Employee(); _Client = n
公司
有组合关系。因此,实现如下
class Company
{
private Employee _Employee {get;set;} // private fields as composition
private Client _Client {get;set;}
public Company()
{
_Employee = new Employee();
_Client = new Client();
}
public AddEmploees() //Employee objects are controlled by Company
{
//
}
public DeleteEmploees()
{
//
}
public AddClients() //Client objects are controlled by Company
{
//
}
public DeleteClients()
{
//
}
}
class Employee
{
string Name {get;set;}
int ID {get;set;}
string Address {get;set;}
string Department {get;set;}
DateTime DOB {get;set;}
private Employee() // constructor private
{
}
}
class Client
{
string CID {get;set;}
string Name {get;set;}
string Type {get;set;}
DateTime StartDate {get;set;}
string Address {get;set;}
private Client() // constructor private
{
}
}
当我想在UI上显示客户
/员工
详细信息时,我的数据服务
应该返回公司
对象,而不是返回员工/客户
对象,因为关系是复合的。因此,我可以在我的DataService
中使用类似GetDetails()
的方法,然后从数据库中获取所需的详细信息,以分配给Employee
和Client
的属性。但现在的问题是,我将无法访问公司
对象的私有字段(\u Employee
,\u Client
)来设置属性值,如下所示
public Company GetDetails()
{
Company company = new Company();
string selectStatement = "SELECT...";
// Get data from DB
company.client.name = rdr["name"].value; // This is not possible.
.
.
.
}
虽然我对解决这个问题几乎没有什么想法,但其中没有一个似乎适合于这种阶级关系(组合),或者违反了关注点分离原则。感谢您在这方面的帮助?您可以通过从公司对象本身而不是从外部调用GetDetails()来解决问题。大概是这样的:
class Company
{
// other class features
public static getDetails(params) // params are there as a filter (if needed)
{
// connect to DB and get the data...
//
// here you can access private members of Company
// return array of companies (or a single company)
}
}
我发现这个解决方案在面向对象的意义上比你的好得多。类公司依靠自身通过静态方法获取数据。在获得实例之前,不需要实例化公司。更重要的是,私人数据得到了很好的保护,外部世界看不见。在您的解决方案中,即使您可以从外部访问私有成员,也会破坏封装,这是不好的
我还将重新考虑使用组合存储客户和雇员,因为他们与公司的自然关系较弱。如果一家公司“死亡”,这并不意味着它的客户雇员也将死亡 看起来您想使用
实现互可见性(AKA C++ <代码>朋友类< /代码>),可以使用
而不是私人的可见性。这将允许r/w访问其他对象的属性。Microsoft也大量使用它(内部类、内部名称空间,请参见示例),因此只要它有助于为什么不可能这样做?因为包含类Company的客户端属性是私有的。您可以创建一个封装它的公共属性
公共客户端{get{return{U Client;}
或者您有一个公共方法来访问单个属性GetClientName
/SetClientName
。在我看来,SoC与这种设计无关。你有着坚实的原则,这并不违反任何规则。