Tag: fluent interface

DSLs /流畅接口的重点是什么?

我最近正在观看关于如何创建流畅的DSL的网络直播,我不得不承认,我不明白为什么会使用这种方法(至少对于给定的例子)。 网络广播提供了一个图像大小调整类,它允许您指定输入图像,resize并使用以下语法将其保存到输出文件(使用C#): Sizer sizer = new Sizer(); sizer.FromImage(inputImage) .ToLocation(outputImage) .ReduceByPercent(50) .OutputImageFormat(ImageFormat.Jpeg) .Save(); 我不明白这是如何比采用一些参数的“传统”方法更好: sizer.ResizeImage(inputImage, outputImage, 0.5, ImageFormat.Jpeg); 从可用性的角度来看,这似乎更容易使用,因为它清楚地告诉您该方法期望作为输入。 相比之下,使用流畅的界面,没有什么可以阻止您省略/忘记参数/方法调用,例如: sizer.ToLocation(outputImage).Save(); 关于我的问题: 1 –是否有某种方法可以提高流畅界面的可用性(即告诉用户他应该做什么)? 2 –这种流畅的界面方法只是C#中现有的命名方法参数的替代吗? 命名参数会使流畅的接口过时,例如类似Objective-C提供的东西: sizer.Resize(from:input, to:output, resizeBy:0.5, ..) 3 –流畅的界面是否过度使用仅仅是因为它们目前很受欢迎? 4 –或者它只是一个被选为网络广播的坏榜样? 在这种情况下,请告诉我这种方法的优点是什么,使用它的意义何在。 顺便说一句:我知道jquery,看看它有多容易,所以我不是在寻找关于那个或其他现有例子的评论。 我正在寻找一些(一般)注释来帮助我理解(例如)何时实现流畅的接口(而不是经典的类库),以及实现它时需要注意的事项。

在Entity Framework中使用Fluent API创建多对多关系

使用Entity Framework的API我会不断发现以下两种方式来映射多对多的关系? 我从未使用过第二种选择……有什么区别? 选项1: modelBuilder.Entity() .HasMany( p => p.Lessons) .WithMany(); 选项2: modelBuilder.Entity() .HasMany(p => p.Lessons) .WithMany() .Map(m => { m.MapLeftKey(“Id”); m.MapRightKey(“Id”); m.ToTable(“StudentAndLessons”); }); MapLeftKey和MapRightKey做了什么? 你何时会使用它并获得了哪些好处?

城堡拦截器与流畅的接口

我正在尝试获得一个我写的拦截器,但由于某些原因,当我请求我的组件时它似乎并没有实例化拦截器。 我正在做这样的事情(原谅我,如果这不完全编译,但你应该得到这个想法): container.Register( Component.For().LifeStyle.Transient, AllTypes.Pick().FromAssembly(…).If(t => typeof(IView).IsAssignableFrom(t)). Configure(c => c.LifeStyle.Is(LifestyleType.Transient).Named(…). Interceptors(new InterceptorReference(typeof(MyInterceptor)). WithService.FromInterface(typeof(IView))); 我在Interceptor的构造函数中放置了断点,它似乎根本没有实例化它。 在过去,我使用XML配置注册了我的拦截器,但我很想使用流畅的界面。 任何帮助将不胜感激!

DELETE语句与具有Entity Framework的SAME TABLE REFERENCE约束冲突

我有一个带有自引用的表,其中ParentId是ID(PK)的FK。 使用EF(代码优先),我建立了如下关系: this.HasOptional(t => t.ParentValue) .WithMany(t => t.ChildValues) .HasForeignKey(t => t.ParentId); 当我尝试删除子节点及其父节点时,DELETE命令对数据库的EF问题不按我预期的顺序 – 它首先尝试删除父节点。 我意识到我在这里有几个选项(我都不喜欢): 首先删除子记录,执行完整保存/提交,然后删除父记录。 由于我的模型的复杂性和维护它的逻辑,这不是一个选项 – 不能随时发出多个提交命令。 在删除任何内容之前解散关系。 这似乎是一个更明智的解决方案,但同样,我必须在DELETE之前使用UPDATE语句发出单独的提交。 我想避免多次保存/提交调用。 在删除父记录之前,使用触发器删除子项。 但我想尽可能避免触发器及其有问题的性质。 所以问题是..有没有办法在父记录之前强制删除子项? 也许我错过了一种明确的方式告诉EF它需要在父母之前照顾这些孩子? 也许有一种方法可以指示EF按ID的降序删除? 我不知道……想法?

如何使用Entity Framework Code-First方法将double 数组存储到数据库

如何使用Entity Framework Code-First将数组的双精度数据存储到数据库中,而不影响现有代码和体系结构设计? 我查看了Data Annotation和Fluent API,我还考虑将double数组转换为字节字符串,并将该字节存储到自己的列中的数据库中。 我无法访问public double[] Data { get; set; } public double[] Data { get; set; } 使用Fluent API的属性,我得到的错误消息是: double[]类型必须是不可为空的值类型才能将其用作参数’T’。 存储Data的类成功存储在数据库中,以及与此类的关系。 我只缺少Data列。

如何动态组合条件?

此问题是对已经回答的问题的增强如何在列表中应用多个过滤条件(同时)? 在上面提到的问题中,我们有一个方法,在所有规范上应用AND运算符。 这是通过在规范上使用LINQ All运算符来实现的。 public static List GetProductsUisngAndFilters(List productList, List<Specification> productSpecifications) { return productList.Where(p => productSpecifications.All(ps => ps.IsSatisfiedBy(p))).ToList(); } 我们需要创建一个能够执行AND , OR和NOT规范(以及它的混合)的新方法(GetProductsUisngDynamicFilters)。 知道怎么解决这个问题吗? 过滤方法 public static class ProductFilterHelper { public static List GetProductsUisngAndFilters(List productList, List<Specification> productSpecifications) { return productList.Where(p => productSpecifications.All(ps => ps.IsSatisfiedBy(p))).ToList(); } } 客户 class Program { static void Main(string[] args) { List […]

无法确定关联的主要结束 – entity framework模型优先

我在Visual Studio中创建了实体数据模型。 现在我有一个SQL查询文件和从Model生成的C#类。 题: 生成的类没有注释或代码(Fluent API)。 可以吗? 我试图运行我的应用程序但抛出了exception: 无法确定类型“Runnection.Models.Address”和“Runnection.Models.User”之间关联的主要结尾。 必须使用关系流畅API或数据注释显式配置此关联的主要结尾。 我读到我不能将Fluent API与“Model First”一起使用。 那我该怎么办? 码: 用户 public partial class User { public User() { this.Events = new HashSet(); this.CreatedEvents = new HashSet(); } public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public […]

C#中可能的部分generics类型推断?

我正在为我的IoC类库重写我的流畅界面,当我重构一些代码以便通过基类共享一些常用function时,我遇到了麻烦。 注意 :这是我想要做的事情,而不是我必须做的事情。 如果我必须使用不同的语法,我会,但如果有人知道如何使我的代码以我想要的方式编译,那将是非常受欢迎的。 我希望某些扩展方法可用于特定的基类,并且这些方法应该是通用的,具有一个generics类型,与方法的参数相关,但是这些方法还应返回与特定后代相关的特定类型。被引用。 使用代码示例比上面的描述更好。 这是一个简单而完整的例子, 它不起作用: using System; namespace ConsoleApplication16 { public class ParameterizedRegistrationBase { } public class ConcreteTypeRegistration : ParameterizedRegistrationBase { public void SomethingConcrete() { } } public class DelegateRegistration : ParameterizedRegistrationBase { public void SomethingDelegated() { } } public static class Extensions { public static ParameterizedRegistrationBase Parameter( this ParameterizedRegistrationBase p, string […]

没有使用generics扩展方法的类型推断

我有以下方法: public static TEventInvocatorParameters Until (this TEventInvocatorParameters p, Func breakCond) where TEventInvocatorParameters : EventInvocatorParameters where TEventArgs : EventArgs { p.BreakCondition = breakCond; return p; } 而这堂课 public class EventInvocatorParameters where T : EventArgs { public Func BreakCondition { get; set; } // Other properties used below omitted for brevity. } 现在,我有以下问题: 此扩展方法显示所有类型,甚至是string 。 我不能写new EventInvocatorParameters(EventABC).Until(e […]