我一直有很多问题让Castle Windsor的非xml配置设置正常工作.与此同时,我看到越来越多的人通过Windsor Container流利的界面提供建议.我在最后一天一直在Gooogling,我无法在任何地方找到这个API.
我在谈论关键.Register()方法,它似乎是IWindsorContainer对象的扩展方法.好像它可能在Castle.MicroKernel.Registration命名空间中,但我无法在任何地方找到相应的库!
另外,有什么地方可以找到这些东西的文档吗?
编辑: 我发现示例项目中的Castle.MicroKernel副本有更多的名称空间,然后是我使用的名称空间(即使这个名称是8天,v1.0.0,而我的是v1.0.3 ......),无法找到.Register()方法或任何样本.
编辑: 我发现了一些在Bitter Coder流畅的界面样本,没有可下载的样本,所以我仍然不知所措.
再次编辑:终于明白了.有关Castle windsor的最新源代码可供使用点击这里,获得最新的成功打造,里面的zip文件是bin目录.流畅的界面在Castle.Microkernel内(你可能需要引用Castle.Dynaproxy,Castle.Dynaproxy2和Castle.Windsor).
PS这篇帖子是"城堡流畅的界面文档"的第一个Google结果,悲伤的家伙,你需要得到它. 蟋蟀唧唧叫什么?精细.让我想一想,然后我会接受它.
我不得不承认,EF 4.1 RC Codefirst,DataAnnotations和FluentAPI的功能对我来说仍然是压倒性的.有时我真的不知道我在做什么;-)请看下面的POCO:
public class Country
{
[Key]
public Guid ID { get; set; }
[Required]
public virtual Currency Currency { get; set; }
}
public class Currency
{
[Key]
public Guid ID { get; set; }
public virtual ICollection<Country> Countries { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
总体思路:每个国家都需要有货币.但是根本不需要将货币分配给一个国家.
如果让EF创建相应的数据库,则按照约定将关系设置为CASCADE DELETE.换句话说:如果删除货币,也会删除相应的国家/地区.但就我而言,这不是我想要的.
我在FluentAPI中想出了一些代码来禁用CASCADE DELETE:
modelBuilder.Entity<Country>()
.HasRequired(cou => cou.Currency)
.WithOptional()
.WillCascadeOnDelete(false);
Run Code Online (Sandbox Code Playgroud)
我认为这意味着:每个国家都需要一种货币.此货币可能有零个,一个或多个国家/地区(可选).每当我删除一种货币时,相应的国家(如果有的话)都不会被级联删除.
令人惊讶的是,如果删除相应的货币,给定的方法仍会级联删除国家/地区.任何人都可以告诉我我想念的是什么吗?
fluent-interface cascading-deletes ef-code-first entity-framework-4.1
我想知道您对使用流畅的界面模式重构一个长方法的看法.
http://en.wikipedia.org/wiki/Fluent_interface
流畅的模式不包括在重构书中.
例如,假设您有这么长的方法(因为它有很多东西,所以有很长的名字)
class TravelClub {
Receipt buyAndAddPointsAndGetReceipt(long amount, long cardNumber) {
buy(amount);
accumulatePoints(cardNumber);
return generateReceipt();
}
void buy(int amount) {...}
void accumlatePoints(int cardNumber) {...}
void generateRecepit() {...}
}
Run Code Online (Sandbox Code Playgroud)
称为:
Receipt myReceipt = myTravelClub.buyAndAddPointsAndGetReceipt(543L,12345678L);
Run Code Online (Sandbox Code Playgroud)
这可以重构为:
class TravelClub {
TravelClub buy(long amount) {
//buy stuff
return this;
}
TravelClub accumulatePoints(long cardNumber) {
//accumulate stuff
return this;
}
Receipt generateReceipt() {
return new Receipt(...);
}
}
Run Code Online (Sandbox Code Playgroud)
并称为:
Receipt myReceipt = myTravelClub.buy(543L).accumulatePoints(12345678L).generateReceipt();
Run Code Online (Sandbox Code Playgroud)
从我的观点来看,分解long方法并分解其名称是一种非常好的方式.
你怎么看?
好的风格(清洁代码书)说方法的名称应该描述方法的作用.因此,例如,如果我有一个验证地址的方法,将其存储在数据库中,并发送电子邮件,如果名称是如此 verifyAddressAndStoreToDatabaseAndSendEmail(address);
要么
verifyAddress_StoreToDatabase_SendEmail(address);
虽然我可以在3种方法中划分该功能,但我仍然需要一种方法来调用这3种方法.所以一个大的方法名称是不可避免的.
拥有和命名的方法肯定描述了该方法的作用,但IMO它的可读性并不高,因为名称可能非常大.你会如何解决它?
编辑:也许我可以使用流畅的风格来分解方法名称,如:
verifyAddress(address).storeToDatabase().sendEmail();
但我需要一种方法来确保调用的顺序.也许通过使用状态模式,但这会导致代码增长.
这就是我想要实现的目标:
config.Name("Foo")
.Elements(() => {
Element.Name("element1").Height(23);
Element.Name("element2").Height(31);
})
.Foo(23);
Run Code Online (Sandbox Code Playgroud)
或者像这样:
.Elements(e => {
e.Name("element1").Height(23);
e.Name("element2").Height(31);
})
.Foo(3232);
Run Code Online (Sandbox Code Playgroud)
这就是我现在所拥有的:
public class Config
{
private string name;
private int foo;
private IList<Element> elements = new List<Element>();
public Config Name(string name)
{
this.name = name;
return this;
}
public Config Foo(int x)
{
this.foo = x;
}
... //add method for adding elements
class Element
{
public string Name { get; set; }
public int Height { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
谁知道怎么做?
我正在开发一个流畅的API,并尝试利用Java的通用方法来提供一个优雅的API来处理我的用户的类型转换.由于类型擦除,我遇到了一些麻烦.
这是我的界面的简化版本,显示了我遇到的问题:
interface Query<T extends Query<T>> {
T execute();
Query<T> appendClause();
}
interface A<T extends A> extends Query<T> { }
class AImpl implements A<A> {
A execute() { ... }
Query<A> appendClause() { ... }
}
Run Code Online (Sandbox Code Playgroud)
我收到了错误AImpl.appendClause().编译器说它A不在其范围内,应该扩展Query.据我所知,我的声明,AImpl实现A<A>该方法A 不延长Query<A>.
在这里得到另一个答案后,我尝试通过更改AImpl为:分解任何潜在的无法解析的递归:
class AImpl implements A<AImpl> {
AImpl execute() { ... }
Query<AImpl> appendClause() { ... }
}
Run Code Online (Sandbox Code Playgroud)
现在我收到一个错误编译A,说"类型参数T不在其范围内".
有人对如何处理这个问题有任何建议吗?Java的泛型让我很头疼.
编辑
我把A的定义改为了
interface A<T extends A<T>> extends …Run Code Online (Sandbox Code Playgroud) 我正在创建一个执行从一种形式到另一种形式的转换.
我现在面临的设计问题是编码器和解码器API是应该在一个接口中还是在单独的接口中.例如,Apache MINA使用单独的接口
我目前正在做这样的事情:
interface Convertor
{
A encode( B b );
B decode( A a );
}
Run Code Online (Sandbox Code Playgroud)
将它们放在一个界面中的基本原理是,您可以集中实现并在一个地方修复任何协议更改.有什么想法吗?
public static class Th
{
public static T e<T>(T theObject) where T : class
{
return theObject;
}
}
public static class ObjectExtensions
{
public static bool Is<T>(this T o, Func<T, bool> a) where T : class
{
return a(o);
}
}
//...
//logic in a method somewhere
Func<string, bool> valid = property => _myService.SomeValidationMethod(property);
if (Th.e(_request.Property).Is(valid))
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
这段代码适合生产吗?为什么?
编辑:感谢您的所有意见.我希望你阅读我对C#语法的延伸,以及阅读你的回答时的突破点.
我正在编写一个流畅的界面,使用如下:
xmlBuilder
.CreateFrom()
.DataSet(someDataSet) //yes I said Dataset, I'm working with a legacy code
.IgnoreSchema()
.Build
Run Code Online (Sandbox Code Playgroud)
该IgnoreSchema()方法可以是WithSchema()或WithDiffGrame()代替它.这些映射到WriteXml()接受以下枚举的DataSet 方法:
我的流畅API调用了将从数据集创建XML的各种工厂对象.我有一个具有核心功能的抽象类型,然后是3个派生类型,它们反映了实现该WriteXmlFromDataSet方法的各种状态(我相信这种方法称为状态模式).这是抽象基类:
public abstract class DataSetXmlBaseFactory : IDataSetXmlFactory
{
...
protected abstract void WriteXmlFromDataSet(XmlTextWriter xmlTextWriter);
public XmlDocument CreateXmlDocument()
{
XmlDocument document = new XmlDocument();
using (StringWriter stringWriter = new StringWriter())
{
using (XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter))
{
WriteXmlFromDataSet(xmlTextWriter);
string content = stringWriter.ToString();
document.LoadXml(content);
return document;
}
}
}
} …Run Code Online (Sandbox Code Playgroud) 为了使我的代码更有条理,我决定使用流畅的接口; 然而,通过阅读可用的教程,我找到了很多方法来实现这种流畅性,其中我找到了一个主题,他说创建Fluent Interface我们应该使用Interfaces,但他没有提供任何好的细节来实现它.
以下是我如何实现Fluent API
public class Person
{
public string Name { get; private set; }
public int Age { get; private set; }
public static Person CreateNew()
{
return new Person();
}
public Person WithName(string name)
{
Name = name;
return this;
}
public Person WithAge(int age)
{
Age = age;
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
Person person = Person.CreateNew().WithName("John").WithAge(21);
Run Code Online (Sandbox Code Playgroud)
但是,我如何让Interfaces以更有效的方式创建Fluent API?
fluent-interface ×10
c# ×3
java ×3
.net ×2
api ×2
refactoring ×2
coding-style ×1
enums ×1
fluent ×1
generics ×1
methods ×1
oop ×1