我使用存储库模式。我的存储库方法接收一个可选的 IClientSessionHandle 参数,默认为 null。每个方法的一部分准备过滤器/更新/等,然后进行调用。由于会话是可选的,我有这样的东西:
if (sessionHandle != null)
await Collection.InsertOneAsync(sessionHandle, myObject);
else
await Collection.InsertOneAsync(myObject);
我想总是发送会话,无论是否为空,都行不通,但我还没有测试过。另外,即使它真的有效,我也不能保证这种行为将来不会改变,因为它不是合同的一部分。
有没有办法打一个电话?
PS:拥有一个可选的 IClientSessionHandle 的原因是为了在事务中或不在事务中重用相同的存储库方法。
一种方法是使用可选参数,例如:
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);