怀疑将在IAppBuilder.CreatePerOwinContext()中注册的对象被处置

时间:2017-09-22 08:42:00

标签: c# asp.net-mvc-5 owin dynamics-crm-365

我怀疑我的对象会被处理掉。

我定制了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类型的?

3 个答案:

答案 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