C# 初始化服务时如何实现using语句?

C# 初始化服务时如何实现using语句?,c#,dynamics-crm,idisposable,using-statement,xrm,C#,Dynamics Crm,Idisposable,Using Statement,Xrm,概述: 我在一个XRM项目中遇到了一些初始化代码,其中被初始化的实例实现IDisPossible,但在实例上没有使用块 在using块中的示例中,有一个在服务上调用的实例方法。但在我下面的例子中,服务实例刚刚初始化。服务方法本身直到在私有方法中的代码中进一步调用才被调用 问题: 如何使用using块进行服务实例初始化 代码示例1:(服务初始化) 代码示例2:(我尝试实现using语句) 看起来您对使用语句的有一些误解。如果从创建到处置服务的代码都是范围本地的,则只能使用using语句 问题中的情

概述:

我在一个XRM项目中遇到了一些初始化代码,其中被初始化的实例实现IDisPossible,但在实例上没有使用块

在using块中的示例中,有一个在服务上调用的实例方法。但在我下面的例子中,服务实例刚刚初始化。服务方法本身直到在私有方法中的代码中进一步调用才被调用

问题:

如何使用using块进行服务实例初始化

代码示例1:(服务初始化)

代码示例2:(我尝试实现using语句)


看起来您对使用语句的
有一些误解。如果从创建到处置服务的代码都是范围本地的,则只能使用
using
语句

问题中的情况是,服务对象的生存期超出了创建对象的范围。因此,您的选择是,重新设计(为每次调用
GetUserInfo
)创建一个新的服务对象)或在不使用using语句的情况下管理服务生命周期

using语句的等价物在和中描述为

using (Font font1 = new Font("Arial", 10.0f)) 
{
    byte charset = font1.GdiCharSet;
}
是的缩写形式

{
    Font font1 = new Font("Arial", 10.0f);
    try
    {
        byte charset = font1.GdiCharSet;
    }
    finally
    {
        if (font1 != null)
            ((IDisposable)font1).Dispose();
    }
}
通常情况下,使用
IDisposable
实现类是最好的方法。但是,在您的例子中,有静态方法和静态变量。因此,第一个问题是,您希望服务生命周期是什么?静态变量的默认答案是:“只要应用程序正在运行”,然后它就会变得清晰,为了确保正确的清理,您必须做什么:

  • 如果多次调用
    CreateSourceServiceObjects
    ,请确保在重新分配之前处置旧的服务对象,或拒绝重新初始化
  • 根据您的程序类型,钩住应用程序出口并手动处理服务对象(如果已分配)
我想指出,通过将类重新设计为非静态类,您可以在这里赢得很多。对于类的实例,您可以使用标准的
IDisposable
模式,这可能比一些自定义程序出口清理代码更安全


话虽如此,如果您的服务具有适当的dispose和finalize功能的实现,您根本不需要担心dispose,因为您的静态对象将一直存在,直到应用程序退出,然后通过finalizer释放非托管资源。

好的,这是有意义的。
using (Font font1 = new Font("Arial", 10.0f)) 
{
    byte charset = font1.GdiCharSet;
}
{
    Font font1 = new Font("Arial", 10.0f);
    try
    {
        byte charset = font1.GdiCharSet;
    }
    finally
    {
        if (font1 != null)
            ((IDisposable)font1).Dispose();
    }
}