小编Kai*_*kus的帖子

存储库模式和内存中的单元测试

我已经看到了Repository Pattern的一些实现,非常简单和直观,在stackoverflow中链接形成其他答案

http://www.codeproject.com/Tips/309753/Repository-Pattern-with-Entity-Framework-4-1-and-C http://www.remondo.net/repository-pattern-example-csharp/

public interface IRepository<T>
{
    void Insert(T entity);
    void Delete(T entity);
    IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate);
    IQueryable<T> GetAll();
    T GetById(int id);
}

public class Repository<T> : IRepository<T> where T : class, IEntity
{
    protected Table<T> DataTable;

    public Repository(DataContext dataContext)
    {
        DataTable = dataContext.GetTable<T>();
    }
...
Run Code Online (Sandbox Code Playgroud)

在进行单元测试时,如何将其设置为在内存中工作?有没有办法从内存中的任何东西构建DataContext或Linq表?我的想法是创建一个集合(List,Dictionary ...)并在单元测试时将其存根.

谢谢!

编辑:我需要这样的东西:

  • 我有一本班级书
  • 我有一个班级图书馆
  • Library构造函数中,我初始化了存储库:

    var bookRepository = new Repository<Book>(dataContext)

  • 这些Library方法使用存储库,就像这样

    public Book GetByID(int bookID)
    { 
        return bookRepository.GetByID(bookID)
    }
    
    Run Code Online (Sandbox Code Playgroud)

在测试时,我想提供一个内存上下文.在生产中,我将提供真实的数据库上下文.

.net c# unit-testing repository-pattern

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

TextWriter序列化为UTF-8字符串

我使用TextWriter进行序列化,因为在字符串序列化和文件序列化之间切换很容易:

序列化为字符串;

TextWriter stringWriter = new StringWriter();
XmlSerializer serializer = XmlSerializer(typeof(ObjectType))
serializer.Serialize(stringWriter , objetToSerialize)
return stringWriter.ToString();
Run Code Online (Sandbox Code Playgroud)

序列化为文件;

TextWriter fileWriter = new StreamWriter(targetXMLFileName, true, Encoding.UTF8);
XmlSerializer serializer = XmlSerializer(typeof(ObjectType))
serializer.Serialize(fileWriter , objetToSerialize)
fileWriter.Close();
Run Code Online (Sandbox Code Playgroud)

我的问题是,当序列化为字符串时,它会创建一个UTF-16("?xml version ="1.0"encoding ="utf-16"?"),而TestWriter编码属性是ReadOnly

我试过了:

var memoryStream = new MemoryStream();
TextWriter stringWriter = new StreamWriter(memoryStream, System.Text.Encoding.UTF8);
XmlSerializer serializer = XmlSerializer(typeof(ObjectType))
serializer.Serialize(stringWriter , objetToSerialize)
return stringWriter.ToString();
Run Code Online (Sandbox Code Playgroud)

但它不起作用.它生成此字符串而不是XML文档:"System.IO.StreamWriter"O_o

如何将TextWriter初始化为UTF-8编码

c# serialization utf-8

7
推荐指数
1
解决办法
7354
查看次数

Uning LINQ可以更改集合中的值

我想我并没有很好地承担LINQ.我想要做:

foreach (MyObjetc myObject in myObjectCollection)
{
    myObjet.MyProperty = newValue
}
Run Code Online (Sandbox Code Playgroud)

只需更改集合中所有元素的属性的所有值.

使用LINQ不是这样的吗?

myObjectCollection.Select(myObject => myObject.MyProperty = newValue)
Run Code Online (Sandbox Code Playgroud)

它不起作用.属性值不会更改.为什么?

编辑:

对不起大家.当然,foreach是正确的方法.但是,在我的情况下,我必须在许多集合中重复foreach,我不想重复循环.所以,最后,我找到了一个'inermediate'解决方案,'foreach'方法,就像'Select'一样:

myObjectCollection.ForEach(myObject => myObject.MyProperty = newValue)
Run Code Online (Sandbox Code Playgroud)

无论如何,它可能不像更简单的那样清晰:

foreach (MyObjetc myObject in myObjectCollection) myObjet.MyProperty = newValue;
Run Code Online (Sandbox Code Playgroud)

linq

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

有条件地序列化/反序列化属性

我有一个类,其对象必须根据布尔值序列化/反序列化属性

[System.SerializableAttribute()]
public class Foo
{
    private string myField;
    private bool myFieldSerializes;

    //Parameterless construction for serializing purposes
    public Foo() { }

    public Foo(string myField, bool myFieldSerializes)
    {
        this.myField = myField;
        this.myFieldSerializes = myFieldSerializes;
    }

    public string MyField
    {
        get {return this.myField;}
        set {this.myField = value;}
    }

    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool MyFieldSerializes
    {
        get {return this.myFieldSerialzes;}
        set {this.myFieldSerialzes = value;}
    }
}
Run Code Online (Sandbox Code Playgroud)

它应该是这样工作的:

  • 如果我创建一个实例并将 myFieldSerializes 设置为“true”,则在序列化对象(使用 XMLSerialize)时,必须序列化 myField(包含在 XML 消息中)。如果设置为“false”,则应忽略它。

  • 反序列化(使用 XMLDeserialize)时,布尔值 myFieldSerializes 应该告诉我 myField 是否已被反序列化(换句话说,它存在于 XML 文件中)。

实现这种行为的方式是什么?

谢谢!:)

c# xml serialization

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

ToolStrip StatusLabel DoubleClick事件不会引发

我无法订阅DoubleClick动态创建的事件ToolStripStatusLabel

在我的代码中,我在中创建了一系列ToolStripStatusLabel项目StatusStrip,并订阅了该DoubleClick事件,但看起来它从未出现过

private void InitStatusBar()
{
    foreach (CardReader cardReader in appConfig.CardReadersList)
    {
        System.Windows.Forms.ToolStripStatusLabel cardReaderStatusLabel = new ToolStripStatusLabel();
        cardReaderStatusLabel.Name = cardReader.Description;
        cardReaderStatusLabel.Tag = cardReader;
        cardReaderStatusLabel.Text = cardReader.Description.ToUpper();
        cardReaderStatusLabel.Image = cardReader.DeviceInfo.GetIconImage();
        cardReaderStatusLabel.DoubleClick += new System.EventHandler(this.cardReaderStatusLabel_DoubleClick);
        this.statusStripBottom.Items.Add(cardReaderStatusLabel);
        this.statusStripBottom.Refresh();
    }
}

private void cardReaderStatusLabel_DoubleClick(object sender, EventArgs e)
{
    ToolStripStatusLabel clickedToolStripLabel = (ToolStripStatusLabel)sender;
    CardReader taggedCardReader = (CardReader)clickedToolStripLabel.Tag;
    MessageBox.Show("Lector: " + taggedCardReader.Description + Environment.NewLine + "Status: " + taggedCardReader.DeviceInfo.CardReaderStatusString);

}
Run Code Online (Sandbox Code Playgroud)

StatusStrip正确初始化(状态标签添加和在状态条显示),但是当他们我双击,什么都不会发生:(

有什么我想念的吗?

谢谢 :)

.net c# events toolstrip winforms

2
推荐指数
1
解决办法
374
查看次数

将 MagickImage 转换为位图

我以为这会更容易,但我找不到办法。如何将 MagickImage 转换为 System.Drawing.Image(例如位图)

    public System.Drawing.Image CreateThumbnailIcon(string sourceImagePath, int iconSize )
    {
        MagickImage image = new MagickImage(sourceImagePath);
        MagickGeometry geometry = new MagickGeometry(iconSize, iconSize);
        image.Resize(geometry);
        return image.??????;
    }
Run Code Online (Sandbox Code Playgroud)

c# magicknet

2
推荐指数
1
解决办法
4314
查看次数

一个优雅的方式来做到这一点?可能是泛型?

我有两个派生类(Sale和ServiceCharge).两者都是交易.如果我有BusinessService,我想为它创建一个ServiceCharge.如果我传递产品,我想实例化Sale.

这是我的想法.

private void CreateInstance(object element)
{
    Transaction transaction;
    if (element.GetType() == typeof(BussinessService))
    {
        transaction = new ServiceCharge((BussinessService)element))
    }
    else
    {
        transaction = new Sale((Product)element);
    }
{
Run Code Online (Sandbox Code Playgroud)

你能告诉我一个更优雅的方式吗?我会知道如何只用一个构造函数来使用泛型

private void CreateInstance<T>(T element)
{
   Transaction transaction = new Transaction((T)element);
}
Run Code Online (Sandbox Code Playgroud)

但我不知道如何处理第一个案例.

c# generics

1
推荐指数
2
解决办法
178
查看次数

在Try-Catch外部使用变量

我需要使用try块内初始化的变量的值.我有这个基本代码

Customer customer = null;
try
{
    customer = new Customer(....);
}
catch (Exception){}
string customerCode = customer.Code;
Run Code Online (Sandbox Code Playgroud)

如果没有例外,则客户完全可用,但如果存在异常,则客户未初始化,则返回null

我检查过客户ALLWAYS在块内正确初始化.INSIDE即使在例外情况下也完全可以使用.但我需要它以供以后使用.

任何方式让ALLWAYS留住客户?:)

编辑:

如你所料,这是伪代码.我可以阅读,看起来在构造函数中使用异常是一个不好的想法.这是我的构造函数的REAL代码的一部分.

public class DirectDebitRemmitanceReject
{
    int numberOfTransactions;
    decimal controlSum;
    List<DirectDebitTransactionReject> directDebitTransactionRejects;

    public DirectDebitRemmitanceReject(
        int numberOfTransactions,
        decimal controlSum, 
        List<DirectDebitTransactionReject> directDebitTransactionRejects)
    {
        this.numberOfTransactions = numberOfTransactions;
        this.controlSum = controlSum;
        this.directDebitTransactionRejects = directDebitTransactionRejects;

        if (TheProvidedNumberOfTransactionsIsWrong()) ChangeNumberOfTransactionsAndRiseException();
        if (TheProvidedControlSumIsWrong()) ChangeControlSumAndRiseException();
    }

    private bool TheProvidedNumberOfTransactionsIsWrong()
    {
        return (numberOfTransactions != directDebitTransactionRejects.Count)
    }

    private bool TheProvidedControlSumIsWrong()
    {
        return (controlSum !=directDebitTransactionRejects.Select(ddRemmitanceReject => ddRemmitanceReject.Amount).Sum();)
    }

    private void ChangeNumberOfTransactionsAndRiseException() …
Run Code Online (Sandbox Code Playgroud)

c#

-2
推荐指数
1
解决办法
578
查看次数