2

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

我定制了 Owin 流程,因为我们使用 CRM 作为数据库和管理,所以我注册OrganizationServiceProxyCreatePerOwinContext()

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 类型?

4

3 回答 3

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");
}
于 2017-09-22T14:36:44.127 回答
2

除了@Shoe 的日志记录方法之外,您还可以通过创建WeakReference对象来验证处置,等待请求完成,手动调用垃圾收集器,然后检查WeakReference.Target. 只要没有其他东西持有引用,如果对象已被收集,Target就会返回。null

WeakReference将允许您持有对某物实例的引用,但仍允许对其进行垃圾收集。

当然不要在生产代码中这样做,这只是为了向自己证明该对象已被释放。

这种方法的方便之处在于,它适用于任何对象,即使是您无法控制且无法覆盖的对象IDisposable

var reference = new WeakReference(myIDsiposableInstance, true);

//Make a request, and wait for it to complete

GC.Collect();
GC.WaitForPendingFinalizers();

if(reference.Target == null)
{
    //Disposed
}
else
{
    //Not Disposed
}
于 2017-09-22T15:10:07.487 回答
1

OrganizationServiceProxy派生自ServiceProxy<TService>which implements IDisposable。如果派生类和抽象类都没有实现,那么它作为传递给IDisposable的返回值将是无效的(因为要求它实现有约束。)这将导致编译器错误。Func<T>CreatePerOwinContextTIDisposable

担心它没有被释放的唯一原因是因为您认为 OWIN 的实现中存在一个错误,它没有调用该Dispose方法,或者其中一个错误或Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy不允许释放Microsoft.Xrm.Sdk.Client.ServiceProxy<TService>该对象。

于 2017-09-22T14:46:39.780 回答