如何创建流畅的界面而不是更传统的方法?这是一种传统方法:
接口
interface IXmlDocumentFactory<T>
{
XmlDocument CreateXml() //serializes just the data
XmlDocument CreateXml(XmlSchema schema) //serializes data and includes schema
}
interface IXmlSchemaFactory<T>
{
XmlSchema CreateXmlSchema() //generates schema dynamically from type
}
用法:
var xmlDocFactory = new XmlDocumentFactory<Foo>(foo);
var xmlDocument = xmlDocFactory.CreateXml();
//or...
var xmlDocFactory = new XmlDocumentFactory<Foo>(foo);
var xmlSchemaFactory = new XmlSchemaFactory<Foo>();
var xmlDocument = xmlDocFactory.CreateXml(xmlSchemaFactory.CreateXmlSchema());
我希望能够说:
var xmlDocument = new XmlDocumentFactory<Foo>(foo).CreateXml().IncludeSchema();
//or...
var xmlDocument = new XmlDocumentFacotry<Foo>(foo).CreateXml();
最后,这种情况是否适合流畅的界面?或者更传统的方法会更有意义吗?
答案 0 :(得分:8)
使接口流畅的关键是确保方法都返回接口本身的实例,或者还实现可以继续处理的接口的其他对象。
因此,在您的情况下,每个IXmlDocumentFactory方法都必须返回一个IXmlDocumentFactory,以便您可以继续调用。最后的方法,如果有的话,返回你真正想要的类型吗?
它提供了非常易读的代码,但有一件事仍然让我有点意思是返回检查。您必须确保无法返回null,否则下一次“流畅的呼叫”将失败。
答案 1 :(得分:5)
在我看来,有三件事是重要的:
1。)有一个初始方法,它返回你将要使用的流畅界面
2。)实现您的Fluent接口的类中的每个方法都会返回自身,因此您可以继续链接 - 这些是真正的流畅方法。
3。)有一个最终方法,它返回你真正想要构建的类型。
在你的例子中,因为你只有两个方法,它的边界很有用 - 通常你会在一个流畅的界面中有更多的方法。或者(我个人更喜欢)您可以在API中提供两种选择:流畅的API和更传统的API(即带有可选参数)。
在你的情况下会做这样的事情:
已编辑以回复评论。
public interface IXmlDocumentFactory<T>
{
XmlDocument Create(); //serializes just the data
IXmlDocumentFactory<T> WithSchema(XmlSchema schema); //serializes data and includes schema
}
public class DocumentFactory<T> : IXmlDocumentFactory<T>
{
private XmlSchema _schema;
private T _data;
public DocumentFactory(T data)
{
_data = data;
}
public IXmlDocumentFactory<T> WithSchema(XmlSchema schema)
{
_schema = schema;
return this;
}
public XmlDocument Create()
{
if (_schema != null)
{
//..use schema/data
return new XmlDocument();
}
else //use data
return new XmlDocument();
}
public static IXmlDocumentFactory<T> From(T data)
{
return new DocumentFactory<T>(data);
}
}
然后你可以像这样使用它:
var xmlDoc = DocumentFactory<int>.From(42)
.WithSchema(new XmlSchema())
.Create();
var xmlDoc = DocumentFactory<int>.From(42)
.Create();
答案 2 :(得分:3)
IMO,流畅的API确实有其价值。流畅地配置组件感觉更像是英语句子,从头到尾很容易阅读。更容易理解开发人员的意图。
有关实施的示例,请参阅Autofac,Moq和Fluent NHibernate
等项目