如何使用 C# MongoDB 驱动程序选择性地传递 IClientSessionHandle?

问题描述 投票:0回答:1

我使用存储库模式。我的存储库方法接收一个可选的 IClientSessionHandle 参数,默认为 null。每个方法的一部分准备过滤器/更新/等,然后进行调用。由于会话是可选的,我有这样的东西:

if (sessionHandle != null)
    await Collection.InsertOneAsync(sessionHandle, myObject);
else
    await Collection.InsertOneAsync(myObject);

我想总是发送会话,无论是否为空,都行不通,但我还没有测试过。另外,即使它真的有效,我也不能保证这种行为将来不会改变,因为它不是合同的一部分。

有没有办法打一个电话?

PS:拥有一个可选的 IClientSessionHandle 的原因是为了在事务中或不在事务中重用相同的存储库方法。

c# mongodb transactions driver optional-parameters
1个回答
0
投票

一种方法是使用可选参数,例如:

public class Collection
{
    public Task InsertOneAsync(object myObject, object sessionHandle = null)
    {
        /*your code*/
        return Task.CompletedTask;
    }
}

现在使用它:

var collection = new Collection();
await collection.InsertOneAsync(myObject,sessionHandle);

另一种方法是使用工厂类,例如:

public interface ICollection
{
    Task InsertOneAsync(object myObject);
}
public static class CollectionFactory
{
    public static ICollection Factory(object sessionHandle)
    {
        switch (sessionHandle)
        {
            case null: return new SimpleCollection();
            default: return new SessionOrientedCollection(sessionHandle);
        }
    }
}

public class SimpleCollection : ICollection
{
    public virtual Task InsertOneAsync(object myObject)
    {
        /*your code*/
        return Task.CompletedTask;
    }
}
public class SessionOrientedCollection : SimpleCollection
{
    private readonly object sessionHandle;
    public SessionOrientedCollection(object sessionHandle)
    {
        this.sessionHandle = sessionHandle;
    }
    public override Task InsertOneAsync(object myObject)
    {
        base.InsertOneAsync(myObject);
        /*your code*/
        return Task.CompletedTask;
    }
}

现在使用它:

var collection = CollectionFactory.Factory(sessionHandle);
await collection.InsertOneAsync(myObject);
© www.soinside.com 2019 - 2024. All rights reserved.