这将是一个有点抽象的问题.
我正在研究一个数据访问层框架,它需要区分表,它的抽象模式/布局和具体的表记录.我担心由于这种区别,会有很多代码重复.我可能需要一些方法来避免这种情况.
+-----------+
| Foo |
+-----------+
| +Id: Guid |
+-----------+
Run Code Online (Sandbox Code Playgroud)
请注意,此图可以描述以下任何一种:表模式,具体表或具体表记录,具有Id类型的字段Guid.
把它翻译成代码,我会得到很多类似的类型(成对的三种).我将使用接口来保持示例简短; 我要展示的是类型的相似性:
// these interfaces only need to be implemented once:
interface ISchemaField<T> { string Name { get; } }
interface ITableField<T> { string Name { get; }
int Index { get; } }
interface IRecordField<T> { string Name { get; }
int Index { get; }
T Value { get; set; } }
Run Code Online (Sandbox Code Playgroud)
// these three interfaces are an …Run Code Online (Sandbox Code Playgroud) c# data-access-layer code-duplication separation-of-concerns
假设我有几个OrderProcessors,每个都处理一个不同的订单.
决定OrderProcessor使用哪个是根据Order对象的属性完成的,并由工厂方法完成,如下所示:
public IOrderProcessor CreateOrderProcessor(IOrdersRepository repository, Order order, DiscountPercentages discountPercentages)
{
if (order.Amount > 5 && order.Unit.Price < 8)
{
return new DiscountOrderProcessor(repository, order, discountPercentages.FullDiscountPercentage);
}
if (order.Amount < 5)
{
// Offer a more modest discount
return new DiscountOrderProcessor(repository, order, discountPercentages.ModestDiscountPercentage);
}
return new OutrageousPriceOrderProcessor(repository, order);
}
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是我想验证返回的OrderProcessor是否已收到正确的参数(例如 - 正确的折扣百分比).
但是,这些属性在OrderProcessor实体上不公开.
您如何建议我处理这种情况?
我能够提出的唯一解决方案是制作OrderProcessor公众的折扣百分比属性,但仅仅为了单元测试而这样做似乎有点过头了......
我刚刚开始使用Unity.我仍然想知道它的优点是什么.
UnityContainer().Resolve<T>()它可以返回为泛型类型注册的类型的具体实例T.
我想我也可以用Activator.CreateInstance<T>().
Activator 是.NET Framework中的内置类,所以我想知道Unity的独特功能是什么?
我想在我的ListBox中有多列。以下是我在应用程序中获得的图片示例。

我实际上有大约7列,但是只打印了两列,以使其更易于理解。
因此,第一列会说date,第二列会说name。如您所见,数据没有进入自己的列。
这是我的代码:
this.listBox1 = new System.Windows.Forms.ListBox();
this.SuspendLayout();
//
// listBox1
//
this.listBox1.FormattingEnabled = true;
this.listBox1.HorizontalScrollbar = true;
foreach (XmlNode xn in xnList)
{
string date = xn.OfType<XmlNode>().FirstOrDefault(n => n.Name == "Date").FirstChild.Value;
string id = xn.OfType<XmlNode>().FirstOrDefault(n => n.Name == "ID").FirstChild.Value;
if (date == cari)
{
this.listBox1.Items.AddRange(new object[] {
//dateBox.Text,
dateBox.Text + "\r\n" + date});
this.listBox1.Items.AddRange(new object[] {
"sarabrown"});
}
}
this.listBox1.Location = new System.Drawing.Point(12, 28);
this.listBox1.MultiColumn = true;
this.listBox1.Name = "listBox1";
this.listBox1.ScrollAlwaysVisible = true;
this.listBox1.Size …Run Code Online (Sandbox Code Playgroud) 有多可靠mysql_insert_id()在竞争条件下我的意思是,当多个用户同时插入数据时,这个函数会返回真实的ID还是会返回其他用户插入的数据ID?
表引擎是MyISAM。
我创建了一个流畅的构建器样式模式,用于帮助我加载测试数据.某些方法的顺序很重要,并且想知道管理正确序列的首选方法是什么.
我现在有以下内容:
using NUnit.Framework;
[TestFixture]
public class DataBuilderTests
{
[Test]
public void Can_NAME()
{
new DataLoader()
.Start() // must be called first
.Setup() // then called next
.LoadEmployees() // optional order not NB
.LoadProducts() // optional order not NB
.StartCleanup() // begin cleanup
.CleanupEmployees() // optional order not NB
.CleanupProducts() // optional order not NB
.End();
}
}
public class DataLoader
{
public DataBuilderSetup Start()
{
return new DataBuilderSetup(this);
}
}
public class DataBuilderSetup
{
private readonly DataLoader _dataLoader;
public …Run Code Online (Sandbox Code Playgroud) 我查看了ILDASMstruct FooStruct中的C# ,并看到了以下内容:

ILDASM 此处显示两个不同的声明:
.class value public.class public(前窗)开头我想知道哪种语法(如果不是两种)是声明值类型的正确语法?修饰符是value严格必需的、可选的还是语法错误?
目前我正在使用antlr4为实时语言PEARL开发编译器.
使用ANTLR4,我的ParseTree中填充了超级令牌,例如.用于结束语法单位的分号.
有没有办法告诉ANTLR忽略这些令牌?
感谢您的帮助和建议!
马塞尔
简而言之,我正在寻找以下两种方法中哪一种应该是首选的指导(以及为什么):
static IEnumerable<T> DistinctA<T>(this IEnumerable<T> xs)
{
return new HashSet<T>(xs);
}
static IEnumerable<T> DistinctB<T>(this IEnumerable<T> xs) where T : IEquatable<T>
{
return new HashSet<T>(xs);
}
Run Code Online (Sandbox Code Playgroud)
赞成的论据DistinctA:显然,约束T不是必需的,因为HashSet<T>它不需要它,并且因为任何实例T都保证可转换为System.Object,它提供与IEquatable<T>(即两种方法Equals和GetHashCode)相同的功能.(虽然非泛型方法会导致拳击与值类型,这不是我在这里关注的.)
赞成的DistinctB参数:泛型参数约束虽然不是绝对必要的,但是使调用者可以看到该方法将比较实例T,因此是一个正确Equals且GetHashCode应该正常工作的信号T.(毕竟,在没有明确实现的情况下定义一个新类型Equals并且GetHashCode非常容易发生,因此约束可能有助于及早发现一些错误.)
问题:是否存在建立和记录的最佳实践,建议何时指定此特定约束(T : IEquatable<T>),何时不指定?如果没有,上述论点之一是否有任何缺陷?(在这种情况下,我更喜欢经过深思熟虑的论点,而不仅仅是个人意见.)
我有一个表,用于保存项目中的人员的数据.该表的Start日期字段为可以为空的End日期字段.所以,一个人从一个项目Start到End.
目前,他们总是对项目收费.但是我现在有了一个新的要求,即在一段时间内,它们可以是不可计费的,但仍然在进行该项目.因此,他们已被分配到项目中并且正在工作,但由于某种原因,客户不会在分配期间的一部分时间收费,或者可能以较低的费率收费.
我的想法是有一个排除类型表,链接到具有开始日期和结束日期的人员分配表,以及一个Rate列,可以设置为零免费,或者作为覆盖值一段时间.
这看起来像是有效的设计吗?由于该人在95%的时间内被收费,并且可能永远不会被排除在外,因此我有一个排除表更有意义.
如果有人知道如何做得更好,那就太好了.
目前,我还有一个"日历"表,我根据人员日程安排的开始/结束日期加入,以获得每日费率.那么,我可以加入排除日期,看看是否有覆盖率?
我可能会在设计中发现的问题是很多连接基于:
ON DateValue BETWEEN Start AND End
Run Code Online (Sandbox Code Playgroud)
而且我不确定它们是最有效的连接.
c# ×5
.net ×2
nunit ×2
activator ×1
antlr4 ×1
cil ×1
concurrency ×1
definition ×1
generics ×1
iequatable ×1
ilasm ×1
listbox ×1
moq ×1
mysql ×1
sql ×1
syntax ×1
unit-testing ×1
value-type ×1
winforms ×1