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