我今天收到了一位同事发来的电子邮件。我的问题是准确的。嵌套Business Objects是不好的做法?任何人都可以对此发光吗?
嵌套对象 在C#中创建任何变量时,它会占用Web服务器上的一块内存。由于我们将在同一台服务器上运行许多工具,因此如果我们不打算使用它们,确保我们不创建对象更为重要。
使用上面的第二个员工对象作为示例...如果我们还需要知道员工主管ID ..(这是所有工具都填充和使用),我们希望确保Employee类包含适当的信息,并考虑工具中的内存和进程。
我们将'supervisorId'字符串变量添加到Employee类,并添加适当的Getters和Setters。
另一方面,我们希望避免在员工对象中嵌套另一个对象。如: 公共类员工{ private string firstName; private string lastName; 私有字符串empId; 私人员工主管;
public string FirstName {
get { return firstName; }
set { firstName = value; }
}
public string LastName {
get { return lastName; }
set { lastName = value; }
}
public string EmpId {
get { return empId; }
set { empId = value; }
}
public Employee Supervisor{
get { return supervisor; }
set { supervisor = value; }
}
}
在这种情况下,我们可能并不总是使用Employee对象的'Supervisor'实例中的值,但是变量是在内存中创建的。这可能会对性能产生潜在的灾难性影响。
在某些情况下,需要嵌套对象: 示例:( Category :: Question)每个类别可以分配一个问题的数组列表。
答案 0 :(得分:8)
对您的一般性问题的简短回答
嵌套业务对象是不是很糟糕?
不是。
很长的答案是,听起来你的团队正在遭受过早的优化。您需要设计业务对象以镜像业务域。您的业务领域中的所有行为都应在您的业务层中进行说明。一旦达到目标,就可以进行性能测试。实际测量系统的哪些部分太慢,然后优化这些部分。在你甚至没有机会完成它之前,不要陷入预先优化你的业务逻辑的境地。
设计并实施,然后进行性能测试,然后在发现不可接受的缓慢时进行优化。
答案 1 :(得分:0)
我的意见是,只有当你经常在嵌套对象上调用方法时才应该嵌套。
如果你要对嵌套对象做的只是获取它的一些属性,那么你不应该嵌套它并且应该直接存储属性。
答案 2 :(得分:0)
从您的代码示例中可以看出,您正在外部设置主管Employee对象(即通过属性设置器),所以我认为这个设计没问题。如果您每次创建“外部”Employee对象时都自动实例化主管对象(例如,通过命中数据库),那么您可能会遇到潜在的问题。
答案 3 :(得分:0)
我相信以下业务对象(数据传输对象)引发了电子邮件:
/// <summary>
/// Manufacturer Data Transfer Object
/// </summary>
public class MfgBO {
public int Id { get; set; }
public string Name { get; set; }
public bool Active { get; set; }
}
}
public class TypeBO {
public int Id { get; set; }
public string Name { get; set; }
public bool Active { get; set; }
}
public class ModelBO {
#region Private Variables
private int mmtId = -1;
private int id = -1;
private string name = String.Empty;
private bool active = false;
private MfgBO mfg = new MfgBO();
private TypeBO type = new TypeBO();
#endregion
// Getter and setters below
看看这个,ModelBO拥有MfgBO和TypeBO,因为如果没有信息,模型就无法完成。他推荐的是在ModelBO而不是MfgBO或TypeBO,我们应该有一个int MakeID变量,字符串MakeName,int DeviceTypeId,字符串DeviceTypeName等,基本上重新输入MfgBO和TypeBO对象中已经存在的字段。
对于我有限的OOP知识,使用MfgBO和TypeBO更有意义。哪种方式更适合我个人的知识?在MakeBO中使用MfgBO和TypeBO实际上会使用更多内存并“可能使服务器崩溃”吗?
答案 4 :(得分:0)
只有在明确访问对象时才能创建对象。
public BusinessObject Item
{
get
{
if (_Item == null)
_Item = new BusinessObject();
return _Item;
}
}
private BusinessObject _Item;