【发布时间】:2016-10-16 06:48:57
【问题描述】:
我在设计一个fluent API,用法有点像这样:
IUser user = work
.Timeout(TimeSpan.FromSeconds(5))
.WithRepository(c => c.Users)
.Do(r => r.LoadByUsername("matt"))
.Execute();
所以,假设work 的类型为IUnitOfWork,但方法WithRepository(c => c.Users) 返回一个名为IActionFlow<IUserRepository> 的接口,即IDisposable。
当我调用Execute() 并获得最终结果时,我失去了对该IActionFlow<IUserRepository> 实例的引用,因此我无法处理它。
将实例置于Execute() 方法上的缺点是什么?
类似:
public TResult Execute()
{
// ...
Dispose();
return result;
}
代码似乎编译得很好,但我正在寻找可能因此而出现的奇怪行为或错误。这是不好的做法吗?
【问题讨论】:
-
嗯,它只是意味着你返回一个看起来很奇怪的处置对象:)。 Fluent 接口有一些问题:ocramius.github.io/blog/fluent-interfaces-are-evil 这里有一个完整的讨论 Dispose pattern with fluent interfaces:davefancher.com/2015/06/14/…