C#设计问题
我开始设计一个小应用程序,并有一些与架构相关的问题 我有一些基本的实体,我愿意建模-C#设计问题,c#,C#,我开始设计一个小应用程序,并有一些与架构相关的问题 我有一些基本的实体,我愿意建模-存储库和指标 Repository基本上是一个使用Repository模式的门面,它能够使用一些数据库持有者检索/存储任意实体(现在它是NHibernate驱动的,但我想这实际上并不重要) 指示器可以称为我的应用程序的逻辑核心。它用于组合抽象值和实现该值的确切时间(因此它形成并在value-time对上运行) 我愿意使这个指标尽可能通用,但我认为我目前的解决方案是一个大失败:) 查看以下代码块: public i
存储库
和指标
Repository
基本上是一个使用Repository模式的门面,它能够使用一些数据库持有者检索/存储任意实体(现在它是NHibernate
驱动的,但我想这实际上并不重要)
指示器可以称为我的应用程序的逻辑核心。它用于组合抽象值和实现该值的确切时间(因此它形成并在value-time
对上运行)
我愿意使这个指标尽可能通用,但我认为我目前的解决方案是一个大失败:)
查看以下代码块:
public interface IIndicator<T>
{
IEnumerable<T> RetrieveValues(DateTime start, DateTime end);
}
// Should also have something like indicator wrapper / proxy stub here - anything
// that represents the 'IIndicator' interface acts through that proxy and
// caches the evaluated data using it.
公共接口指示器
{
IEnumerable RetrieveValues(日期时间开始、日期时间结束);
}
//这里还应该有类似于指示符包装器/代理存根的东西-任何东西
//表示“IIndicator”接口通过该代理和
//使用它缓存已计算的数据。
这是实现该指标的基本尝试(目前这实际上可以被视为模拟):
公共类指示器:
//自引用泛型参数。
指示器
{
//代理,用于将时间戳添加到
//每个指示值。
公共类时间戳代理
{
公共价值;
公共日期时间;
公共时间戳代理(日期时间,TValue值)
{
时间=时间;
价值=价值;
}
}
私有只读存储库;
公共指示器(IRepository存储库)
{
this.repository=存储库;
}
公共IEnumerable RetrieveValues(日期时间开始、日期时间结束)
{
//注意lambda中的自定义时间戳比较
//表达式。比较包括“开始”和“结束”限制。
IQueryable queryable=repository.Retrieve(
x=>x.Time.CompareTo(start)>=0&&x.Time.CompareTo(end)如何将RetrieveValues方法重构回存储库本身,并使用一个简单得多的指示符类,它基本上取代了timestamproxy类
public class Indicator<T>
{
public DateTime Timestamp { get; set; }
public T Value { get; set; }
}
public class Repository
{
public IEnumerable<Indicator<T>> RetrieveIndicators<T>( DateTime start, DateTime end )
{
// determine table to query based on type T
// query and convert objects to Indicator<T>
// return collection
}
}
公共类指示器
{
公共日期时间时间戳{get;set;}
公共T值{get;set;}
}
公共类存储库
{
公共IEnumerable RetrieveIndicator(日期时间开始,日期时间结束)
{
//根据类型T确定要查询的表
//查询并将对象转换为指示器
//回收
}
}
困扰我的一件事是,在使其通用化时,您已经失去了与DB表的连接。最好只定义一个所有特定DB对象实现的接口,并使用部分实现将实际“值”映射到value属性
public interface Indicator<T>
{
DateTime Timestamp { get; }
T Value { get; }
}
public partial class TemperatureIndicator : Indicator<double>
{
public double Value { get { return this.Temperature; } }
}
公共接口指示器
{
日期时间时间戳{get;}
T值{get;}
}
公共部分类温度指示器:指示器
{
公共双精度值{get{返回this.Temperature;}}
}
现在,让您的存储库实现返回每种类型的对象的方法,这些对象可以用作(在.NET 4中或在较低版本中转换为)接口类型的对象,用于常见操作
public interface Indicator<T>
{
DateTime Timestamp { get; }
T Value { get; }
}
public partial class TemperatureIndicator : Indicator<double>
{
public double Value { get { return this.Temperature; } }
}