我怀疑我的对象会被处理掉。
我定制了Owin流程因为我们使用CRM作为数据库和管理,所以我在OrganizationServiceProxy
CreatePerOwinContext()
app.CreatePerOwinContext(CrmConnection.Create);
从OrganizationServiceProxy
继承的课程
public class CrmConnection : OrganizationServiceProxy
{
private CrmConnection()
: base(new Uri(ConfigurationManager.AppSettings["CrmUri"])
, null
, new ClientCredentials()
{
UserName =
{
UserName = ConfigurationManager.AppSettings["CrmUsername"],
Password = ConfigurationManager.AppSettings["CrmPassword"]
}
}
, null
)
{ }
public static CrmConnection Create()
{
return new CrmConnection();
}
所以我怀疑是在请求结束后会处理这个对象的实例吗?
我做了一些研究,如果我做对了,传递给CreatePerOwinContext()
的每个对象都应该是IDisposable类型的?
答案 0 :(得分:3)
传递给CreatePerOwinContext()的每个对象都应该是类型 IDisposable的?
应该。必须。查看CreatePerOwinContext
public static IAppBuilder CreatePerOwinContext<T>(
this IAppBuilder app,
Func<IdentityFactoryOptions<T>, IOwinContext, T> createCallback
)
where T : class, IDisposable
您无法注册任何未实现IDisposable
所以我的怀疑是将这个对象的实例放在后面 请求结束了?
您可以通过记录Dispose
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
Debug.WriteLine($"I'm disposing");
}
答案 1 :(得分:2)
除了@ Shoe的日志记录方法之外,您还可以通过为对象创建WeakReference
,等待请求完成,手动调用垃圾收集器,然后检查{{1}来验证处理方式。 }。只要没有其他内容存在引用,WeakReference.Target
将返回Target
如果已收集该对象。
null
将允许您保存对某事物实例的引用,但仍允许对其进行垃圾回收。
当然,不要在生产代码中执行此操作,这只是为了向自己证明对象已被处理。
关于这种方法的一个方便之处是,它适用于任何对象,即使是那些超出你控制范围的对象,你也无法覆盖WeakReference
。
IDisposable
答案 2 :(得分:1)
OrganizationServiceProxy
派生自实现ServiceProxy<TService>
的{{1}}。如果派生类和抽象类都没有实现IDisposable
那么它将作为传递给IDisposable
的{{1}}的返回值无效(因为Func<T>
存在约束要求它实现CreatePerOwinContext
。)这会导致编译器错误。
担心它没有被处理的唯一理由是因为你认为OWIN的实现中没有调用T
方法或者{{1}中存在错误不允许对象处理的{}或IDisposable
。