Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 在业务逻辑层中使用静态类_Design Patterns_Static_Business Logic_N Tier Architecture - Fatal编程技术网

Design patterns 在业务逻辑层中使用静态类

Design patterns 在业务逻辑层中使用静态类,design-patterns,static,business-logic,n-tier-architecture,Design Patterns,Static,Business Logic,N Tier Architecture,我知道我的问题的答案可能涉及到选择一种具体的方法,但我试图用细节来解释我想要了解的内容: 考虑一个简单的三层应用程序(DAL、BLL、PL)。 DAL首先使用EF4.1代码,对数据的访问被封装在一个存储库中 现在,在BLL中,我有Manager类。(例如,UserManager,ProductManager),它们都源于BaseManager。几乎我的Manager类中的每个方法都将其相关实体作为参数,并对其执行适当的操作。e、 g.在用户管理器中(伪代码): 问题是:我的manager类不需要

我知道我的问题的答案可能涉及到选择一种具体的方法,但我试图用细节来解释我想要了解的内容:

考虑一个简单的三层应用程序(DAL、BLL、PL)。
DAL首先使用EF4.1代码,对数据的访问被封装在一个存储库中

现在,在BLL中,我有
Manager
类。(例如,
UserManager
ProductManager
),它们都源于
BaseManager
。几乎我的Manager类中的每个方法都将其相关实体作为参数,并对其执行适当的操作。e、 g.在用户管理器中(伪代码):

问题是:我的manager类不需要实例化。它们可以定义为静态。
但是,如果我将它们定义为静态的,我应该在每个类中创建共享方法和成员(如
存储库
,以及一些其他成员)(我不想将存储库等成员定义为静态的)


那么,您是否建议我将真正应该是静态的Manager类更改为静态类?或者可以按原样使用它们吗?

静态类只不过是函数(而不是真实对象)的容器。不同之处在于,可以派生非静态类,并通过构造函数获取它们的依赖项

尝试为静态类编写适当的测试

您可能不打算让它们成为今天的实例,但明天呢?如果您将它们更改为静态,则必须重构所有依赖的代码以取消它们的静态性


我宁愿开始使用控制反转容器来管理它们的创建和实例。

我认为没有理由让它们保持静态。就我所见,这只会使API和实现复杂化。调用方将从何处检索存储库?他们应该为每个电话查找它吗?那太浪费了。最好只查找一次并将其存储在manager中。这就是实例变量的用途。

我喜欢创建一个静态“目录”(该对象的正确名称实际上是repository),其中包含我的所有实例。例如:

public static Class BusinessRepository
{
    private static Users users = new Users();

    public static Users Users
    {
        get
        {
            return users;
        }
    }
}
BusinessRepository类是静态的,但用户是其中包含的实例对象。然后可以这样访问:

BusinessRepository.Users.DoSomething();
通过这种方式,您可以保留对象实例及其带来的所有好处,以及对它们的静态访问


很多人不同意他们所说的“全局变量”,但这是你的判断。似乎您已经做出决定,您对此感到满意,因为您已经在谈论静态类。

使用IoC控制经理的创建是我最可能选择的路径。什么是存储库?我在工作中一直习惯于将所有业务对象设置为无状态,因为我们的系统是多用户的,如果我们将其设置为无状态,那么我们只需创建一个业务对象实例,所有用户都可以共享,而不会弄乱彼此的数据。
BusinessRepository.Users.DoSomething();