将 BLL 类标记为静态或?

Posted

技术标签:

【中文标题】将 BLL 类标记为静态或?【英文标题】:marking BLL classes as static or? 【发布时间】:2012-02-03 09:18:30 【问题描述】:

我已经有了一个运行良好的分层数据访问设计。但我不知道这是否是最合适的实现。 我只是想知道 BLL 类或方法应该是静态的还是应该是只有一个实例的 concreate 类? 同时,我不需要序列化 ​​BLL 类来在这样的 SOA 设计中使用它。但我不知道这个功能会带来什么。 查看以下选项:

    BLL 类和方法是静态的 BLL 类不是静态的,但它的方法是静态的 BLL 类不是静态的,也不是它的方法。应用程序应每次创建 BLL 类以访问其方法。 BLL 类不是静态的,也不是它的方法。但是每个 BLL 类只有一个实例。并且应用程序使用这些静态实例来使用 BLL 方法。

哪一个在性能和设计方面最有效?

编辑: 选项1

public static class BllCustomer

    public static List<ModelCustomer> GetCustomers()
    

    


// usage
BllCustomer.GetCustomers();

选项2

public class BllCustomer

    public static List<ModelCustomer> GetCustomers()
    

    


// usage
BllCustomer.GetCustomers();

选项3

public class BllCustomer

    public List<ModelCustomer> GetCustomers()
    

    


// usage
BllCustomer bllCustomer = new BllCustomer();
bllCustomer.GetCustomers();

选项4

public class BllCustomer

    public List<ModelCustomer> GetCustomer()
    

    


// usage
public static BllCustomer s_BllCustomer = new BllCustomer();
// whenever needed
s_BllCustomer.GetCustomer();

【问题讨论】:

为什么人们要坚持不对这个问题发表意见,我简直无法理解。可能,他们在许多其他问题中看不到这个话题。是的,我在自言自语。 【参考方案1】:

我个人使用大量这些技术构建了系统。最后我应该意识到我太聪明了,因为最简单的技术实际上是最灵活的。如果您因为感觉工作量减少并因此“更高效”而想将其设为静态,那么您这样做的原因是错误的。

我建议不要将类或方法设为静态。原因是我发现 DDD 和依赖注入 (IoC) 等模式非常有价值。例如,您将如何测试一些使用此 BLL 的网站或应用程序代码?通常,您会想要“模拟”您的 BLL,以便它返回可预测的结果。使用静态类将很难做到这一点。

【讨论】:

【参考方案2】:

对于性能和易用性,选项二最有意义。我现在正在使用选项 2,并且没有遇到任何问题。它们中的大多数只包含一个调用 DAL 的行,然后是另一个使用 log4net 记录的行。它们中的大多数都没有很多业务逻辑。

不过,我在 ASP.NET 中使用它。

【讨论】:

你说你会选择选项2。你认为选项1和选项2的区别是什么?它们既易于使用又是静态的。那为什么不选择选项1呢? 我不使用选项 1,因为它太死板了。使用静态类,您的所有成员都必须是静态的。与静态类相比,具有静态成员的非静态类更为典型。您仍然可以使用选项 2 创建一个实例,但是您会遇到使用选项 1 的静态类。选择最简单的方法。此外,选项 1/2 不是单元测试的理想选择,但如果您没有太多这些方法,那么无论如何都不需要单元测试。我的大部分逻辑都在存储过程中,这取决于。【参考方案3】:

序列化您的 Domain / BusinessLogicLayer 类听起来有点不寻常,因为您的 Domain 层通常包含业务规则和复杂的处理逻辑。通常你会想要序列化你的 DataTransformation / POCO 类。

静态或具体类/方法之间会有细微的performance 差异。我会回避主要业务逻辑的静态类和方法,因为它们可能难以模拟/单元测试,而且不能与 IoC 容器一起使用。因此,考虑到这一点,我会推荐选项 3,正如您所解释的那样。还有一些非常有用的答案张贴here。

【讨论】:

阅读问题后,我首先想到的是嘲笑问题。对此以及有关 IoC 容器的信息表示赞同

以上是关于将 BLL 类标记为静态或?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们需要将 Swift 类标记为 `public` 或 `open` 以使其在 Objective-C 框架项目中可访问?

构造函数

这个类被标记为“@immutable”,但它的一个或多个实例字段不是最终的:

Obsolete---标记方法 类过期

C#,实现类似方法的“静态抽象”

绑定到静态类属性[重复]