抱歉这个长问题,它被标记为 wiki,因为我要求的东西可能没有非常具体的答案。如果它关闭了,那就这样吧。
我的主要问题是:
您将如何编写一个未在基类中完全定义的流畅接口,以便使用流畅接口的程序可以在现有结构中添加新词,并仍然保持引导界面,以便在点之后,智能感知仅列出此时实际应用的关键字。
我正在进行第三次重写 IoC 容器的迭代。第二次迭代是为了提高性能,第三次迭代将解决一些可扩展性问题和分离问题。
基本上,可扩展性的问题是没有。我最近想使用一个有生命周期的服务,在生命周期结束后,解析一个新副本。例如,每分钟读取一个配置文件,但不会更频繁。我当前的 IoC 解决方案不支持这一点,但添加它的唯一方法是进入基类库并在那里添加对它的支持。这对我来说意味着我未能构建可扩展的类库。平心而论,我并不打算在其中构建可扩展性,但是我并没有完全意识到稍后再添加这样的东西会有多痛苦。
我正在查看我的流利配置界面,因为我也想在界面中构建完整的可扩展性(或摆脱它,我不愿意这样做),我需要以不同的方式做事。
因此,我需要你的意见。我实际上使用流畅接口的经验很少,但我见过很多使用它们的代码,因此开箱即用有一个明显的好处:
- 使用流畅接口的代码通常很容易阅读
换句话说,这:
ServiceContainer.Register<ISomeService>()
.From.ConcreteType<SomeService>()
.For.Policy("DEBUG")
.With.Scope.Container()
.And.With.Parameters
.Add<String>("connectionString", "Provider=....")
.Add<Boolean>("optimizeSql", true);
比这更容易阅读:
ServiceContainer.Register(typeof(ISomeService), typeof(SomeService),
"DEBUG", ServiceScope.Container, new Object[] { "Provider=...", true });
所以可读性是一个问题。
然而,程序员指导是另一回事,通过阅读现有代码、在网络上或在编辑器中不容易理解。
基本上,当我输入以下内容时:
ServiceContainer.Register<ISomeService>()
.From.|
^-cursor here
然后智能感知将显示可用的分辨率类型。在我选择了那个之后,然后写:
ServiceContainer.Register<ISomeService>()
.From.ConcreteType<SomeService>()
.For.|
然后我只能在“For”关键字之后获得可用的东西,例如“Policy”等。
然而,这是一个大问题吗?你用过的流畅的界面是这样的吗?定义接口的明显方法是创建一个包含所有关键字和所有内容的类或接口,以便每个逗号后的智能感知包含所有内容,但这也可能导致这是合法的(例如,它编译)代码:
ServiceContainer.Register<ISomeService>()
.From.ConcreteType<SomeService>()
.From.Delegate(() => new SomeService())
.From.With.For.Policy("Test");
所以我想构建流畅的接口,这样在你指定如何解析服务之后,你就不能再这样做了。
- 换句话说,流畅的界面非常易于使用,因为它们会引导您完成您可以做的事情。
但这是典型的吗?由于我希望能够添加一堆这样的关键字,比如解析器的类型(ConcreteType、Delegate等)、作用域的类型(Factory、Container、Singleton、Cache等)作为扩展方法,这样程序可以定义自己的方式来做到这一点,而无需进入并更改基类,这意味着我需要为所有中间停止提供接口,并让实际重要的关键字成为。然后,这些关键字的实现必须根据需要选择一个要返回的中间停止接口。
所以看起来我需要定义一个接口:
- xyz.来自。
xyz.From.<Resolver here>.
<Resolver here>.With.
<Resolver here>.For.
等等,但这在我看来是支离破碎的。
任何有流畅界面经验的人都可以回去阅读我在顶部附近引用的答案并尝试给我一个简短的答案吗?