c#-4.0 – 用于访问文本文件的存储库模式
发布时间:2020-12-15 21:26:29 所属栏目:百科 来源:网络整理
导读:我是Repository Pattern的新手,我想正确地做到这一点.我也在尝试使用Inversion of Control(也是新的). 我想确保我正确使用存储库模式. 我选择了这个作为我的存储库的基本接口的示例. public interface IRepositoryT where T : class{ IEnumerableT Find(Expr
|
我是Repository Pattern的新手,我想正确地做到这一点.我也在尝试使用Inversion of Control(也是新的).
我想确保我正确使用存储库模式. 我选择了这个作为我的存储库的基本接口的示例. public interface IRepository<T> where T : class
{
IEnumerable<T> Find(Expression<Func<T,bool>> where);
IEnumerable<T> GetAll();
void Create(T p);
void Update(T p);
}
IPaymentRepository用于IRepository的扩展(虽然我不明白为什么我需要这个,如果我有上面的Find方法) public interface IPaymentRepository : IRepository<Payment>
{
}
PaymentRepository只是读取一个文本文件并构建一个POCO. public class PaymentRepository : IPaymentRepository
{
#region Members
private FileInfo paymentFile;
private StreamReader reader;
private List<Payment> payments;
#endregion Members
#region Constructors
#endregion Constructors
/// <summary>
/// Initializes a new instance of the <see cref="PaymentRepository"/> class.
/// </summary>
/// <param name="paymentFile">The payment file.</param>
public PaymentRepository(FileInfo paymentFile)
{
if (!paymentFile.Exists)
throw new FileNotFoundException("Could not find the payment file to process.");
this.paymentFile = paymentFile;
}
#region Properties
#endregion Properties
#region Methods
public IEnumerable<Payment> Find(Expression<Func<Payment,bool>> where)
{
throw new NotImplementedException();
}
/// <summary>
/// Gets all payments from payment file.
/// </summary>
/// <returns>Collection of payment objects.</returns>
public IEnumerable<Payment> GetAll()
{
this.reader = new StreamReader(this.paymentFile.FullName);
this.payments = new List<Payment>();
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
Payment payment = new Payment()
{
AccountNo = line.Substring(0,11),Amount = double.Parse(line.Substring(11,10))
};
this.payments.Add(payment);
}
return this.payments;
}
public void Create(Payment p)
{
throw new NotImplementedException();
}
public void Update(Payment p)
{
throw new NotImplementedException();
}
#endregion Methods
我想知道如何实现Find方法.我假设我会调用GetAll并为存储库构建内部缓存.例如,我想查找付款金额超过50美元的所有帐户. 解决方法
使用您当前的IRepository签名,您可以像这样实现它:
public IEnumerable<Payment> Find(Expression<Func<Payment,bool>> where)
{
this.reader = new StreamReader(this.paymentFile.FullName);
this.payments = new List<Payment>();
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
Payment payment = new Payment()
{
AccountNo = line.Substring(0,10))
};
if (where(payment)
{
this.payments.Add(payment);
}
}
return this.payments;
}
但是,如果您的系统内存允许,您可以保留缓存列表(来自GetAll())并使用列表中的Find().根据列表的大小,这应该快一个数量级. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
