假设没有返回void,而是返回对类的引用,即使它没有任何特定的语义意义.在我看来,它会给你更多关于如何调用方法的选项,允许你以流畅的界面风格使用它,我不能真正想到任何缺点,因为你不需要做任何事情带有返回值(甚至存储它).
因此,假设您处于要更新对象然后返回其当前值的情况.而不是说
myObj.Update();
var val = myObj.GetCurrentValue();
Run Code Online (Sandbox Code Playgroud)
你可以把两条线结合起来说
var val = myObj.Update().GetCurrentValue();
Run Code Online (Sandbox Code Playgroud)
编辑: 我一想到就问下面,回想起来,我同意它可能是不必要的和复杂的,但是关于归还这个而不是无效的我的问题就在于此.
在一个相关的说明中,你们怎么看待这种语言包括一些新的语法糖:
var val = myObj.Update()<.GetCurrentValue();
Run Code Online (Sandbox Code Playgroud)
此运算符的优先级较低,因此myObj.Update()将首先执行,然后在myObj上调用GetCurrentValue()而不是Update的void返回.
基本上我正在想象一个操作员会说"在左边的第一个有效对象上调用操作员右侧的方法".有什么想法吗?
我正在构建一个流畅的接口,其中我有一个包含大量流畅逻辑的基类,以及一个添加了一些特殊行为的派生类.我面临的问题是从派生类型的实例调用时基类中的流畅方法的返回类型.在调用基类的方法之后,只有基类的方法仍然可用于进一步的流畅调用.
更改调用方法的顺序将有助于编译,但它使其可读性降低,这对于流畅的接口来说是有意义的.有没有办法为基类定义某种"This"类型,以便所有方法返回相同的类型.
public class Field<T>
{
public Field<T> Name( string name )
{
_name = name;
return this;
}
}
public SpecialField<T> : Field<T>
{
public SpecialField<T> Special(){ return this; }
}
// !!! Arrgh. Special is not a member of the Field<T> class.
var specialField = new SpecialField()
.Name( "bing" )
.Special();
Run Code Online (Sandbox Code Playgroud)
我尝试通过执行类似下面的操作来解决它,但它无效C#:(但至少表达了我想如何编码接口.
public class Field<T,TThis> : TThis
where TThis : Field<T,TThis>
{
public TThis Name( string name ){...}
}
public SpecialField<T> : Field<T,SpecialField<T>>
{
public TThis …Run Code Online (Sandbox Code Playgroud) 我使用Castle Windsor作为我的IoC容器.我有一个具有类似于以下结构的应用程序:
IEmployeeServiceIContractHoursService...EmployeeService : MyApp.Services.IEmployeeServiceContractHoursService : MyApp.Services.IContractHoursService...我目前使用XML配置,每次添加新的IService/Service对时,我都需要在XML配置文件中添加一个新组件.我想将所有这些切换到流畅的注册API,但还没有找到完全正确的配方来做我想要的.
有人可以帮忙吗?生活方式都将是singleton.
提前谢谢了.
嗨,我正在努力了解如何构建一个可读的,也可以防止Fluent-API出错,而不会对用户造成太大限制
保持简单让我们说我们想要改变下面的课程,以便流利
public class Car
{
public int Gallons { get; private set; }
public int Tons { get; private set; }
public int Bhp { get; private set; }
public string Make { get; private set; }
public string Model { get; private set; }
public Car(string make, string model)
{
Make = make;
Model = model;
}
public void WithHorsePower(int bhp)
{
Bhp = bhp;
return this;
}
public void WithFuel(int gallons)
{
Gallons = gallons;
}
public …Run Code Online (Sandbox Code Playgroud) 我通过方法链创建了一些小的流畅接口.它们通常调用许多从Web服务/数据库获取数据的存储库.
我该如何进行使用流畅界面的单元测试方法?
Public IEnumberable<Computer> FindComputers(string serialNumber)
{
return Computers.FindBySerialNumber("YBCX00900")
.AttachConfiguration()
.EnsureAllComputersHaveConfiguration();
}
Run Code Online (Sandbox Code Playgroud)
我可以对流畅的界面的各个组件进行单元测试,但如果我想对上面的FindComputers方法进行单元测试,我该怎么办?
我想找到一种易于维护的方法.
我目前正忙着为现有技术实现流畅的界面,这将允许类似于以下代码段的代码:
using (var directory = Open.Directory(@"path\to\some\directory"))
{
using (var file = Open.File("foobar.html").In(directory))
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
为了实现这样的构造,需要使用类来累积参数并将它们传递给其他对象.例如,要实现Open.File(...).In(...)构造,您需要两个类:
// handles 'Open.XXX':
public static class OpenPhrase
{
// handles 'Open.File(XXX)':
public static OpenFilePhrase File(string filename)
{
return new OpenFilePhrase(filename);
}
// handles 'Open.Directory(XXX)':
public static DirectoryObject Directory(string path)
{
// ...
}
}
// handles 'Open.File(XXX).XXX':
public class OpenFilePhrase
{
internal OpenFilePhrase(string filename)
{
_filename = filename
}
// handles 'Open.File(XXX).In(XXX):
public FileObject In(DirectoryObject directory)
{
// ...
} …Run Code Online (Sandbox Code Playgroud) .net performance garbage-collection fluent-interface runtime
请原谅我,如果这个问题看起来很愚蠢,但我对整个函数式编程世界都很陌生,所以我需要在StackOverflow上使用一些居民来让我直截了当.
从我收集的内容来看,对monad的操作会返回monad.这是否意味着monad具有流畅的接口,其中应用于monad的每个函数在将一些操作应用于它包装的变量之后返回该monad?
我有一个相当简单的复合一对多关系,使用POCO/Fluent API定义,其中一列是一个字符串.
我发现我们数据库中这一栏中的数据在案例方面是不一致的,即'abb','ABB' - 这是我们的主要ERP系统,并且由各种来源提供,这些来源主要是我们无法控制的.
这在加入相关表时首先使用EF代码时出现问题,因为当PK/FK的情况不同时,即使SQL Profiler显示正在执行的SQL和返回的结果,EF也会默认忽略该连接.
我正在使用WCF,因此关闭了延迟加载和代理创建,并且急于使用Include加载所需的相关实体.例如.
var member = context.Member.Include(m => m.Audits).First(m => m.Id == id);
Run Code Online (Sandbox Code Playgroud)
除了修改数据库模式之外,还有其他解决方案吗?
fluent-interface code-first ef-code-first entity-framework-4.1
我正在使用一个流畅的继承接口.我声明基类Constructor受到保护,所以你不能创建一个Foo <Bar>,它会在调用add()时导致ClassCastException.但我遇到了返回新Foo实例的静态方法的问题.
public class Foo<T extends Foo<T>> // if i change to extends Foo i only get warnings
{
public static Foo<Foo> createFoo() // <-- error
{
return new Foo<Foo>(); // <-- error
}
protected Foo() {}
public T add()
{
//...
return (T)this;
}
}
public class Bar extends Foo<Bar>
{
public Bar sub()
{
//...
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
这主要是Fluent Interfaces,Domain-specific language和Generics中的练习(个人而不是家庭作业),所以请不要问我需要它.
编辑:Eclipse错误
Bound mismatch: The type Foo is not a valid substitute for the bounded parameter <T …Run Code Online (Sandbox Code Playgroud) 我有一个基础对象,我不希望在DB中作为一个实体映射,我只希望将属性添加到DB中映射的对象:
没有映射的对象(不知道它是否重要但是baseobject在另一个程序集中):
public class BaseObject
{
public virtual string Prop1 { get; set; }
public virtual string Prop2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
映射对象:
public class ChildObject : BaseObject
{
public virtual string Prop3 { get; set; }
public virtual string Prop4 { get; set; }
public virtual string Prop5 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
什么在DbContext中注册
public DbSet<ChildObject> ChildObjects { get; set; }
Run Code Online (Sandbox Code Playgroud)
我想在Db看到什么
table:ChildObject
col:Prop1 (from BaseObject)
col:Prop2 (from BaseObject)
col:Prop3
col:Prop4
col:Prop5
Run Code Online (Sandbox Code Playgroud)
要恢复,我想要做的是在Db中有一个具有子项和基本属性的表.
这是我目前得到的错误:
未映射类型"namespace.ChildObject".使用Ignore方法或NotMappedAttribute数据批注检查未明确排除类型.验证类型是否已定义为类,不是原始类,嵌套类还是通用类,并且不从EntityObject继承.
我一直在挖,但找不到怎么做.
有任何想法吗?
编辑: …
fluent-interface ×10
c# ×5
.net ×4
code-first ×2
fluent ×2
generics ×2
inheritance ×1
java ×1
monads ×1
performance ×1
runtime ×1
unit-testing ×1