Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#设计问题_C# - Fatal编程技术网

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; } }
}