我正在将大量代码移到Castle Trunk中,其中包括用于配置容器的新流畅界面.由于该项目有一个超出维护的巨大windsorConfig xml文件,我想我会开始利用这个新功能.我知道其他容器(例如StructureMap 2.0)也包含用于容器配置的流畅接口,所以这个问题不是基于Windsor.
我的问题是你使用新的流畅样式接口用于容器配置的约定/习语/模式是什么?
我的第一个想法是在某处创建一个静态方法(例如ContainerConfig.Config),它会将应用程序使用的所有相关类型加载到容器中.我担心最终这个单片函数最终会像xml配置文件一样难以维护(减去尖括号税).
我的第二个想法是将其分解,因此每个依赖程序集按照惯例导出其默认配置.我可以看到这对程序集内部使用的层次结构很有用.但对于外部使用的类型,是否应该在内部定义配置?
我想的越多,我似乎提出的问题就越多.你对此有什么想法?
我有一个Customer实体,它引用了一组地址.这里的复杂性是我希望能够将特定地址识别为默认地址.
如果可能的话,我想在Customer表中保存默认地址的FK.这似乎比在地址表中有一列来识别默认值更优雅.
在定义这种关系方面,我在使用流畅的API方面遇到了困难.当我运行以下代码时,我得到一个异常,其中说: "保存未公开其关系的外键属性的实体时发生错误.EntityEntries属性将返回null,因为无法将单个实体标识为异常的来源通过在实体类型中公开外键属性,可以更容易地在保存时处理异常.有关详细信息,请参阅InnerException."无法确定依赖操作的有效排序.由于外键约束,模型要求或存储生成的值,可能存在依赖关系."
我创建了一个控制台应用程序来显示确切的问题.在这个测试应用程序中,我有一个Customer实体,一个Address和flient api配置.
任何帮助将非常感激:
using System;
using System.Collections.Generic;
using System.Data.Entity.ModelConfiguration;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
namespace OneToManyWithDefault
{
public class Customer
{
private ICollection<Address> m_Addresses;
public Customer()
{
Addresses = new List<Address>();
}
public int Id { get; set; }
public string CompanyName { get; set; }
public virtual ICollection<Address> Addresses
{
get
{
if (m_Addresses == null)
{
m_Addresses = new List<Address>();
}
return m_Addresses;
}
set
{
m_Addresses = value;
}
}
public Address DefaultAddress { …Run Code Online (Sandbox Code Playgroud) 我有两个看起来像这样的表:
dbo.ReviewType
ReviewTypeId INT PRIMARY KEY
ShortName CHAR(1) - Unique Index
Description
dbo.Review
ReviewId INT PRIMARY KEY
ReviewType_ShortName CHAR(1) - FK to ReviewType
...
Run Code Online (Sandbox Code Playgroud)
评论始终具有ReviewType.
ReviewType可以与许多评论相关联.
我在使用Code First Fluent API在Entity Framework中映射它时遇到了麻烦.看起来它不喜欢我使用不映射到主键的外键.我使用外键到Unique Constraint/Index而不是Primary Key.
如何使用C#在Entity Framework中正确映射?
我应该注意到我现在这样做的方式是给我这个错误:
System.Data.Edm.EdmAssociationConstraint ::参照约束的从属角色中的所有属性的类型必须与主体角色中的相应属性类型相同.实体Review'上的属性'ReviewTypeCode'的类型与引用约束'ReviewType_Reviews'中实体'ReviewType'上的属性'Id'的类型不匹配.
我一直在阅读关于Java,JavaScript和Scala中的OO'流畅的界面'方法,我喜欢它的外观,但一直在努力寻找如何在Scala中使用更基于类型/功能的方法来协调它.
给出一个非常具体的例子:我编写了一个API客户端,可以像这样调用:
val response = MyTargetApi.get("orders", 24)
Run Code Online (Sandbox Code Playgroud)
返回值get()是一个Tuple3名为的类型RestfulResponse,在我的包对象中定义:
// 1. Return code
// 2. Response headers
// 2. Response body (Option)
type RestfulResponse = (Int, List[String], Option[String])
Run Code Online (Sandbox Code Playgroud)
这工作正常 - 我真的不想牺牲元组返回值的功能简单性 - 但我想用各种'流畅'方法调用来扩展库,可能是这样的:
val response = MyTargetApi.get("customers", 55).throwIfError()
// Or perhaps:
MyTargetApi.get("orders", 24).debugPrint(verbose=true)
Run Code Online (Sandbox Code Playgroud)
如何将get()返回类型元组(或类似元组)的功能简单性与为我的API添加更多"流畅"功能的能力相结合?
我想在我的mvc网站上实现流畅的api.我得到了基础知识.所以实现对象库如:
public class UIElement{/*...*/}
public class ButtonBase : UIElement{/*...*/}
public class LinkButton : ButtonBase {/*...*/}
public static class Extensions
{
public static T UIElementMethod<T>(this T element, string title)
where T : UIElement
{
return element;
}
public static T ButtonBaseMethod<T>(this T element, string title)
where T : ButtonBase
{
return element;
}
public static T LinkButtonMethod<T>(this T element, string title)
where T : LinkButton
{
return element;
}
}
Run Code Online (Sandbox Code Playgroud)
但是如何在没有一些flush方法调用的剃刀视图中使用它.
@Html.UIproject().LinkButton()
.UIElementMethod("asd")
.ButtonBaseMethod("asd")
.LinkButtonMethod("asd")
Run Code Online (Sandbox Code Playgroud)
但它返回类的名称.我试图为MvcHtmlString创建一个隐式运算符,但它没有被调用.任何想法如何实现这一点.如何知道它是链和链.我喜欢 Kendo UI的工作方式.
谢谢,
Péter
NUnit 是否提供了一个约束来确定实际值是否是给定的可枚举或数组的元素,换句话说,它等于多个预期值中的任何一个?就像是:
Assert.That(actual, Is.EqualToAnyOf(new[] { 1, 2, 3 }))
Run Code Online (Sandbox Code Playgroud)
也就是说,要指出的是,实际值是单个值。我希望值是1, 2, 或3。断言
Assert.That(actual, Contains.Element(expected))
Run Code Online (Sandbox Code Playgroud)
检查逻辑上相同,但意图相反:这里我们有一个实际值的集合,并期望其中有一个值。
此外,我发现了这些,但它们都不适合:
Assert.That(actual, Is.EqualTo(expected)) // only allows one value
Assert.That(actual, Is.InRange(start, end)) // only works for consecutive numbers
Assert.That(actual, Is.SubsetOf(expected)) // only works if actual is an enumerable
Assert.That(expected.Contains(actual)) // meaningless "expected: true but was: false" message
Run Code Online (Sandbox Code Playgroud) 我已经创建了一组类来表示用于表示BPM过程的有向循环图,它基于JUNG的DirectedSparseGraph类,它只提供基本的图形操作方法来添加和查找顶点和边.
我面临的挑战是创建一个构建器,它提供了一个流畅的界面,能够创建包含复杂分支,循环和多个终端节点的图形(参见下面的示例).
并行分支

合并分支机构

周期

复杂

我当前的实现(参见下面的示例)正在求助发生fork的顶点(例如,Parallel Branches中的顶点"B" ),然后在向该顶点添加新分支时引用别名.我的构建器还包括类似的东西,允许合并分支和循环.引入别名是因为顶点名称在BPM图中不是唯一的.我想要一个更优雅流畅的界面来快速构建图形,不受这些参考.
Graph graph = GraphBuilder.newGraph()
.addVertex("A")
.edgeName("")
.addVertex("B", "b-fork")
.edgeName("")
.addVertex("C")
.edgeName("")
.addVertex("E")
.addBranch("b-fork")
.edgeName("")
.addVertex("D")
.edgeName("")
.addVertex("F")
.build();
Run Code Online (Sandbox Code Playgroud) java design-patterns fluent-interface directed-graph builder
我正在为我正在玩的一些简单的验证内容创建一些流畅的界面.我注意到的一件事是我创建了很多不同的对象.
例如,鉴于以下陈述:
Check.Assertion.ForValue.That(value, "value").IsNotNull() : void
Check.Assertion.ForArgument.That(value, "value").IsNotNull() : void
Validate.Assertion.ForDate.That("Test").IsNotNull() : bool
Validate.Assertion.ForNumeric.That("Test").IsNotNull() : bool
Run Code Online (Sandbox Code Playgroud)
每个'.' (接受最后一个)我正在新建一个对象.如果我在这里没有使用流畅的界面,我会使用静态方法.
我想知道的是,如果有人知道在使用这些实例对象(注意它们是非常小的对象)时会注意到性能上的任何真正差异,就像使用静态方法一样.
干杯安东尼
.net performance static-methods fluent-interface instance-methods
我目前正在学习使用Propel ORM,我想重用一个critera用于两个稍微不同的查询:
$criteria = ArticleQuery::create()
->filterByIsPublished(true)
->orderByPublishFrom(Criteria::DESC)
->joinWith('Article.Author')
->keepQuery();
$this->news = $criteria
->filterByType('news')
->find();
$this->articles = $critera
->filterByType('article')
->find();
Run Code Online (Sandbox Code Playgroud)
但是,这不会按预期工作,因为现在对文章的查询将尝试查找类型为"新闻"和"文章"的条目,这当然是不可能的.
所以我们需要得到这个对象的克隆,对我来说似乎直观的是简单地在paranthesis中添加clone关键字:
$this->news = (clone $criteria)
->filterByType('news')
->find();
Run Code Online (Sandbox Code Playgroud)
Parse error: syntax error, unexpected T_OBJECT_OPERATOR
相反,我们必须先将它分配给变量才能使用它:
$clonedCritera = clone $criteria;
$this->news = $clonedCriteria
->filterByType('news')
->find();
Run Code Online (Sandbox Code Playgroud)
您与new运营商具有相同的行为.我看到推进开发者通过替换:
new ArticleQuery()->doOperations()with来规避这个限制ArticleQuery::create()->doOperations().
为什么PHP语言设计者选择这样做?如果你可以直接使用这些表达式的结果,它将使代码更流畅,在某些情况下,更容易阅读.
我想创建一个流畅的界面,可以像这样使用:
void Main() {
ModelStateMappings.MapDomainModel<Book>().MapViewModel<BookViewModel>()
.Properties(book => book.Author, vm => vm.AuthorsName)
.Properties(book => book.Price, vm => vm.BookPrice);
ModelStateMappings.MapDomainModel<Store>().MapViewModel<StoreViewModel>()
.Properties(store => store.Owner, vm => vm.OwnersName)
.Properties(store => store.Location, vm => vm.Location);
}
Run Code Online (Sandbox Code Playgroud)
我希望最终得到一个看起来像这样的集合:
static class ModelStateaMappings {
private static IList<ModelMappings> mappings;
// other methods in here to get it working
}
class ModelMappings {
public Type DomainModelType {get;set;}
public Type ViewModelType {get;set;}
public IList<PropertyMapping> PropertyMappings {get;set;}
}
class PropertyMapping {
public Expression<Func<object, object>> DomainProperty {get;set;}
public Expression<Func<object, object>> ViewModelProperty {get;set;}
} …Run Code Online (Sandbox Code Playgroud) fluent-interface ×10
.net ×3
c# ×3
asp.net-mvc ×1
assertions ×1
builder ×1
entity ×1
expression ×1
fluent ×1
generics ×1
java ×1
nunit ×1
performance ×1
php ×1
propel ×1
razor ×1
scala ×1
structuremap ×1