【问题标题】:When should I instantiated my classes in Web Services (ASMX)?我应该什么时候在 Web 服务 (ASMX) 中实例化我的类?
【发布时间】:2019-12-02 16:12:45
【问题描述】:

我有以下 WebServise (asmx):

public class MyService : WebService
{
    private readonly UserHandler _UserHandler;
    private readonly RoleHandler _RoleHandler;

    public MyService()
    {
        _UserHandler = HandlerFactory.CreateUserHandler();
        _RoleHandler = HandlerFactory.CreateRoleHandler();
    }
}

每个请求都会执行 MyService() 构造函数,那么实例化 _UserHandler 和 _RoleHandler 的位置是否正确? 我应该用以下实现替换我当前的代码吗?

public class MyService : WebService
{
    private static readonly UserHandler _UserHandler = HandlerFactory.CreateUserHandler();
    private static readonly RoleHandler _RoleHandler = HandlerFactory.CreateRoleHandler();
}

在最后一个实现中,_UserHandler 和 _RoleHandler 将只实例化一次,所有请求都将使用该实例。

谁是最好的实现?

谢谢。-

【问题讨论】:

    标签: c# asp.net web-services asmx lifecycle


    【解决方案1】:

    我更喜欢构造函数。

    从语言的角度来看是相同的,都是在构造函数上实例化的。
    构造函数的形式(对我来说)更好,因为将来如果您愿意,您可以更改构造函数并 inject 模拟 RoleHandlerUserHandler

    【讨论】:

    • 谢谢。性能和使用的资源(垃圾收集器)怎么样?如果我使用构造函数解决方案,它将为每个请求实例化RoleHandlerUserHandler
    • 是的,构造函数为每个请求实例化,而另一个是静态的,在应用启动时实例化一次。
    • 那么,最好的解决方案是什么?
    • 对我来说是构造函数。每个请求都会实例化 WebService,因此非静态上的静态是相同的。在构造函数上,您有机会添加一个新的构造函数并注入模拟的 RoleHandler 和 UserHandler 进行单元测试。
    • 我知道每个请求都会实例化 WebService,但静态属性只实例化一次。
    猜你喜欢
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2011-09-25
    • 2013-01-16
    • 2010-09-17
    • 2012-09-27
    相关资源
    最近更新 更多