我已经看到了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)在测试时,我想提供一个内存上下文.在生产中,我将提供真实的数据库上下文.
我使用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编码
我想我并没有很好地承担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) 我有一个类,其对象必须根据布尔值序列化/反序列化属性
[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 文件中)。
实现这种行为的方式是什么?
谢谢!:)
我无法订阅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正确初始化(状态标签添加和在状态条显示),但是当他们我双击,什么都不会发生:(
有什么我想念的吗?
谢谢 :)
我以为这会更容易,但我找不到办法。如何将 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) 我有两个派生类(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)
但我不知道如何处理第一个案例.
我需要使用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)