当数据服务返回对象时,类组合问题

本文关键字:组合 问题 对象 数据 服务 返回 | 更新日期: 2023-09-27 18:05:08

在一个项目中,我有以下类关系。EmployeeClientCompany有组成关系。因此实现如下:

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上显示client/employee细节时,我的DataService应该返回Company对象,而不是返回Employee/Client对象,因为关系是组合。所以我可以在我的DataService中有一个像GetDetails()这样的方法,然后从数据库中获取所需的详细信息,以分配EmployeeClient的属性。但现在的问题是,我将无法访问Company对象的私有字段(_Employee, _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.
.
.
.
}

虽然我有一些想法来解决这个问题,但它们似乎都不适合这种类关系(组合)或违反关注点分离原则。感谢你在这方面的帮助?

当数据服务返回对象时,类组合问题

看起来你想用

MSDN: Factory Design Pattern

为了实现相互可见性(也就是c++ friend class),你可以使用

内部可见性修饰符

而不是私有可见性。这将允许r/w访问其他对象的属性。微软也大量使用它(内部类,内部命名空间,例如http://referencesource.microsoft.com/#PresentationFramework/src/Framework/MS/Internal/Data/CollectionViewGroupInternal.cs),所以只要它有帮助,它就不是一个被禁止的设计实践

您可以通过从Company对象本身而不是从外部调用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)
    }
}

我发现这个解决方案在OO意义上比你的好得多。Class Company依靠自己通过静态方法获取数据。在获得实例之前不需要实例化COmpany。更重要的是,私人数据得到了很好的保护,对外部世界不可见。在您的解决方案中,即使您可以从外部访问私有成员,也会破坏封装,这是不好的。

我也会重新考虑使用组合来存储客户端和员工,因为它们与公司的自然关系较弱。如果一家公司"死了",那绝对不意味着它的员工或客户也会死。