0

尝试在我的新应用程序套件中构建基本的 3 层架构。我第一次想开始应用最佳设计实践(如 IoC/DI 等)。

我的 UI 层必须创建一个 BLL 对象才能完成它的工作。

假设我的 UI 需要调用 BLL 10 次。我是否必须创建我的 BLL 对象 10 次,或者我必须在表单加载时创建一次?

4

5 回答 5

1

我的 UI 层必须创建一个 BLL 对象才能完成它的工作。

首选做法是在创建时或稍后通过属性将业务层对象的接口注入您的 GUI 表单时。在这种情况下,您的表单对业务层对象一无所知,不需要实例化它们,只做它应该做的事情——GUI 交互。

我个人更喜欢构造函数注入:

public class MyForm
{
    private IDocumentStorage documentStorage;
    private IJobsRegistrator jobsRegistrator;

    public MyForm(IDocumentStorage documentStorage, IJobsRegistrator jobsRegistrator)
    {
        this.documentStorage = documentStorage;
        this.jobsRegistrator = jobsRegistrator;
    }
}

您的业​​务层接口在哪里IDocumentStorage以及在哪里。IJobsRegistrator如果有一些限制(比如,你只能有无参数的构造函数),你可以使用属性设置器。

于 2012-12-12T13:19:50.610 回答
1

每次调用都重新创建业务对象是正常的。这有助于维护无状态应用程序,如果您正在制作基于 HTTP 的网站,这就是您想要的。

如果由于某些重量级的对象而成为问题,您可以采取一些措施,例如创建对象缓存/池,或将内容保存在 Session 对象中。除非你发现你必须去,否则不要去那里。

于 2012-12-12T13:24:04.747 回答
0

嗯......如果你期待一个直接的答案,你会感到失望。答案是——视情况而定。

如果您的对象是无状态的轻量级对象 - 如果它让您的生活更轻松,请每次都创建它。

另一方面,如果您的对象必须保持状态,或者需要大量资源来创建它,则必须将其创建为单例,以及创建/管理单例所需的所有开销。

DI 容器都支持这两种场景,但您可以根据自己的场景选择合适的场景

于 2012-12-12T13:23:06.913 回答
0

如果对象是服务类型类,即接受一些输入并提供一些输出(例如存储库类型对象),您会希望您的 UI 层依赖于它的抽象版本,例如:

public class UILayerComponent
{
    private readonly IBLLObject _bllobject;

    public UILayerComponent(IBLLObject obj)
    {
        _bllobject = obj;
    }

}

但是 UI 层应该对这个对象的实例化、生命周期管理甚至具体实现一无所知。这应该是您的 IoC 容器处理的工作。

但是,如果对象是状态驱动的——例如,由一个用户操作创建,并由另一个用户操作更新或删除——那么您应该在有意义的时候创建和处置它。

于 2012-12-12T13:27:07.353 回答
0

严格来说 - 简单的 3 层

第 1 层 - 数据库 这里没有逻辑,只是通过 RDBMS 机制进行数据检索和存储

第 2 层 - 业务逻辑/数据访问数据访问对象(向/从第 1 层传递/获取数据,应在此处创建业务对象)和应从此处创建/填充/保存业务数据(域)对象

第 2 层用户界面除了将数据(在从第 2 层获得的业务对象中)呈现给用户以供用户创建/操作外,什么都不做

于 2012-12-12T13:27:35.313 回答