我有一个AgentBalance类与Agent关联,因此:
public class AgentBalance
{
...
public int AgentId { get; set; }
public virtual Agent Agent { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
按惯例,AgentId被检测为代理关系的FK,但我想在Mapping类中将其显式化,以便对未来的更改更安全.如果Agent有一个Balances集合,那么我知道如何做到这一点,例如:
HasRequired(t => t.Agent).WithMany(a => a.Balances).HasForeignKey(t => t.AgentId);
Run Code Online (Sandbox Code Playgroud)
但是,代理没有余额集合 - 我不希望该关联可以反向导航.但是如果没有映射中的.WithMany,我就无法选择指定.HasForeignKey.还有另外一种方法吗?(注意我知道我也可以使用属性来做这个,但我想使用流畅的API映射).
这是我想写的:
public void Foo<T>(T parameter) {
otherObject.Bar<T>(parameter);
}
Run Code Online (Sandbox Code Playgroud)
Bar()方法的签名是:
public void Bar<T>(T parameter) where T: class
Run Code Online (Sandbox Code Playgroud)
所以我得到一个编译错误,因为Foo签名中的T没有相同的约束.不幸的是我不能写:
public void Foo<T>(T parameter) where T: class {
otherObject.Bar<T>(parameter);
}
Run Code Online (Sandbox Code Playgroud)
因为Foo正在实现在外部接口中定义的方法.问题是:
在调用Bar之前,我可以以某种方式在方法Foo中转置T. (注意,我可以肯定T总是会成为一个类 - 我只需要通过编译器).
我发现的唯一方法是使用反射,但我想知道是否有一个更简单的技巧,我错过了.
这个问题经常出现在我的编码中,我很惊讶我能找到很少的参考,并且会重视其他人的想法和想法.
我为我所使用的框架以及我想要分解的大型域模型定义了许多API.这些API几乎完全由接口组成(在我的例子中,意思是C#接口).我一遍又一遍地发现,我想区分两种界面.在没有找到更广泛使用的术语的情况下,我将这两个术语定义如下:
"角色"接口旨在由API外部的对象实现,以便这些对象可以用作API上定义的方法的参数.
"结果"接口由API内的对象实现,并通过API提供给系统的其他部分.定义结果接口而不是公开实现它的对象的目的是将对象的视图限制到外部世界.
举一个例子,Payments子系统可能将IPayableItem定义为Role接口,由应用程序的其他部分中的许多类型实现,以便为它们生成Payments.那些生成的Payment对象可以通过API检索,但由Result接口IPayment定义.
我目前唯一可以区分这些的方法是命名约定和/或注释.理想情况下,我希望语言强制执行区分,并强制执行规则:您不能在API之外实现Result接口,只能使用它.但是C#没有提供任何这样的机制.(任何人都可以告诉我一种语言吗?).我可以定义一个属性,但这仍然不会强制执行任何操作.
区别的另一个重要意义在于API的语义版本控制.如果我将一个新成员添加到Role接口,那么这应该被视为一个重大变化(因此是一个第一级版本) - 因为任何现有的外部实现都需要添加该成员.但是,如果我将一个成员添加到我认为是"结果"界面,那么它应该只是我自己的代码受到影响 - 它只是一个新功能(二级版本)供其他人使用.但是由于两种类型之间没有强制区分,因此人们实施Result接口存在一些风险,因此他们的代码将被破坏.
还有其他人遇到过这种困境吗?如果是这样,你是如何处理它的?我期待着你的回答.
但请不要两者都回答以下任何一个论点(我经常听到):
我的Result接口应该是抽象类而不是接口.这并没有解决问题,并且可能使情况变得更糟,因为外部代码可以对它们进行子类化.
我应该返回具体类型并确保我不想在API之外访问的任何内容都标记为"内部".在很多情况下,我需要API内部的东西是公开的,例如可以被其他框架访问(不通过API).
我希望能够创建多个Func
s,每个 s 接受一个类型的实例并返回相同的类型,例如:
Func<Foo, Foo>
Func<Bar, Bar>
Run Code Online (Sandbox Code Playgroud)
然后将这些添加到 a List
(或者可能添加到 a Dictionary
,由Func
处理的类型键控)。
然后给定任何实例y
(其类型在编译时未知),我想检索并调用Func
适用于 on 的实例y
。
我所要求的甚至可能吗?
我搜索了最明显的来源,但找不到列为特定版本中引入的三元运算符。(我需要知道这些信息作为历史参考)。