小编sta*_*ica的帖子

在对表,其布局和记录建模时,如何避免代码重复,所有这些都共享相同的基本结构?

这将是一个有点抽象的问题.

我正在研究一个数据访问层框架,它需要区分表,它的抽象模式/布局和具体的表记录.我担心由于这种区别,会有很多代码重复.我可能需要一些方法来避免这种情况.

+-----------+
|    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

5
推荐指数
1
解决办法
247
查看次数

单元测试工厂方法

假设我有几个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公众的折扣百分比属性,但仅仅为了单元测试而这样做似乎有点过头了......

nunit unit-testing moq

5
推荐指数
1
解决办法
706
查看次数

UnityContainer.Resolve优于Activator.CreateInstance的优势是什么?

我刚刚开始使用Unity.我仍然想知道它的优点是什么.

UnityContainer().Resolve<T>()它可以返回为泛型类型注册的类型的具体实例T.

我想我也可以用Activator.CreateInstance<T>().

Activator 是.NET Framework中的内置类,所以我想知道Unity的独特功能是什么?

.net c# unity-container activator

5
推荐指数
1
解决办法
2330
查看次数

ListBox中的多列数据

我想在我的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)

.net c# listbox multiple-columns winforms

5
推荐指数
1
解决办法
6万
查看次数

并发数据插入中的mysql_insert_id问题

有多可靠mysql_insert_id()在竞争条件下我的意思是,当多个用户同时插入数据时,这个函数会返回真实的ID还是会返回其他用户插入的数据ID?

表引擎是MyISAM。

mysql concurrency mysql-insert-id

5
推荐指数
1
解决办法
934
查看次数

在构建器模式中管理顺序的首选方法是什么?

我创建了一个流畅的构建器样式模式,用于帮助我加载测试数据.某些方法的顺序很重要,并且想知道管理正确序列的首选方法是什么.

我现在有以下内容:

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)

c# nunit design-patterns

5
推荐指数
2
解决办法
981
查看次数

如何在 CIL 中声明值类型:`.class value` 还是只是 `.class`?

我查看了ILDASMstruct FooStruct中的C# ,并看到了以下内容:

在此输入图像描述

ILDASM 此处显示两个不同的声明:

  • 一个以(后窗和前窗标题栏)开头.class value public
  • 一个以.class public(前窗)开头

我想知道哪种语法(如果不是两种)是声明值类型的正确语法?修饰符是value严格必需的、可选的还是语法错误?

syntax cil definition value-type ilasm

5
推荐指数
1
解决办法
629
查看次数

antlr4:创建ParseTrees时忽略超级令牌

目前我正在使用antlr4为实时语言PEARL开发编译器.

使用ANTLR4,我的ParseTree中填充了超级令牌,例如.用于结束语法单位的分号.

有没有办法告诉ANTLR忽略这些令牌?

感谢您的帮助和建议!

马塞尔

antlr4

5
推荐指数
1
解决办法
2114
查看次数

何时指定约束`T:IEquatable <T>`,即使它不是严格要求的?

简而言之,我正在寻找以下两种方法中哪一种应该是首选的指导(以及为什么):

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>(即两种方法EqualsGetHashCode)相同的功能.(虽然非泛型方法会导致拳击与值类型,这不是我在这里关注的.)

  • 赞成的DistinctB参数:泛型参数约束虽然不是绝对必要的,但是使调用者可以看到该方法将比较实例T,因此是一个正确EqualsGetHashCode应该正常工作的信号T.(毕竟,在没有明确实现的情况下定义一个新类型Equals并且GetHashCode非常容易发生,因此约束可能有助于及早发现一些错误.)

问题:是否存在建立和记录的最佳实践,建议何时指定此特定约束(T : IEquatable<T>),何时不指定?如果没有,上述论点之一是否有任何缺陷?(在这种情况下,我更喜欢经过深思熟虑的论点,而不仅仅是个人意见.)

c# generics iequatable type-constraints type-parameter

5
推荐指数
1
解决办法
459
查看次数

支付表设计

我有一个表,用于保存项目中的人员的数据.该表的Start日期字段为可以为空的End日期字段.所以,一个人从一个项目StartEnd.

目前,他们总是对项目收费.但是我现在有了一个新的要求,即在一段时间内,它们可以是不可计费的,但仍然在进行该项目.因此,他们已被分配到项目中并且正在工作,但由于某种原因,客户不会在分配期间的一部分时间收费,或者可能以较低的费率收费.

我的想法是有一个排除类型表,链接到具有开始日期和结束日期的人员分配表,以及一个Rate列,可以设置为零免费,或者作为覆盖值一段时间.

这看起来像是有效的设计吗?由于该人在95%的时间内被收费,并且可能永远不会被排除在外,因此我有一个排除表更有意义.

如果有人知道如何做得更好,那就太好了.

目前,我还有一个"日历"表,我根据人员日程安排的开始/结束日期加入,以获得每日费率.那么,我可以加入排除日期,看看是否有覆盖率?

我可能会在设计中发现的问题是很多连接基于:

 ON DateValue BETWEEN Start AND End
Run Code Online (Sandbox Code Playgroud)

而且我不确定它们是最有效的连接.

sql database-design

5
推荐指数
1
解决办法
315
查看次数