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与这种设计无关。你有着坚实的原则,这并不违反任何规则。