标签: fluent-interface

如何访问Castle Windsor的Fluent Interfaces API?

我一直有很多问题让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结果,悲伤的家伙,你需要得到它. 蟋蟀唧唧叫什么?精细.让我想一想,然后我会接受它.

api castle-windsor fluent-interface

4
推荐指数
1
解决办法
1772
查看次数

EF 4.1 RC:奇怪的级联删除

我不得不承认,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

4
推荐指数
1
解决办法
3462
查看次数

使用流畅的接口重构长方法

我想知道您对使用流畅的界面模式重构一个长方法的看法.

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方法并分解其名称是一种非常好的方式.

你怎么看?

java refactoring fluent-interface fluent

4
推荐指数
1
解决办法
645
查看次数

long方法的方法名称

好的风格(清洁代码书)说方法的名称应该描述方法的作用.因此,例如,如果我有一个验证地址的方法,将其存储在数据库中,并发送电子邮件,如果名称是如此 verifyAddressAndStoreToDatabaseAndSendEmail(address);

要么

verifyAddress_StoreToDatabase_SendEmail(address);

虽然我可以在3种方法中划分该功能,但我仍然需要一种方法来调用这3种方法.所以一个大的方法名称是不可避免的.

拥有和命名的方法肯定描述了该方法的作用,但IMO它的可读性并不高,因为名称可能非常大.你会如何解决它?

编辑:也许我可以使用流畅的风格来分解方法名称,如:

verifyAddress(address).storeToDatabase().sendEmail();

但我需要一种方法来确保调用的顺序.也许通过使用状态模式,但这会导致代码增长.

methods refactoring fluent-interface

4
推荐指数
1
解决办法
113
查看次数

创建流畅的界面,以便将元素添加到列表中

这就是我想要实现的目标:

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)

谁知道怎么做?

.net c# fluent-interface

4
推荐指数
3
解决办法
2235
查看次数

如何为我的流畅API构建接口层次结构?

我正在开发一个流畅的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)

java generics fluent-interface

4
推荐指数
1
解决办法
331
查看次数

单独的解码/编码接口或在一个接口中

我正在创建一个执行从一种形式到另一种形式的转换.

我现在面临的设计问题是编码器和解码器API是应该在一个接口中还是在单独的接口中.例如,Apache MINA使用单独的接口

我目前正在做这样的事情:

interface Convertor
{
    A encode( B b );

    B decode( A a );
}
Run Code Online (Sandbox Code Playgroud)

将它们放在一个界面中的基本原理是,您可以集中实现并在一个地方修复任何协议更改.有什么想法吗?

java oop api fluent-interface

3
推荐指数
1
解决办法
930
查看次数

流利的C#到目前为止还有多远?

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#语法的延伸,以及阅读你的回答时的突破点.

c# coding-style fluent-interface

3
推荐指数
1
解决办法
436
查看次数

依赖注入和Fluent API - 遇到一些问题

我正在编写一个流畅的界面,使用如下:

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 方法:

  • XmlWriteMode.WriteSchema
  • XmlWriteMode.DiffGram
  • XmlWriteMode.IgnoreSchema

我的流畅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)

.net enums dependency-injection fluent-interface

3
推荐指数
1
解决办法
941
查看次数

流畅的接口实现

为了使我的代码更有条理,我决定使用流畅的接口; 然而,通过阅读可用的教程,我找到了很多方法来实现这种流畅性,其中我找到了一个主题,他说创建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?

c# fluent-interface

3
推荐指数
1
解决办法
969
查看次数