小编SWe*_*eko的帖子

如何在UI,BLL,DAL之间使用DTO

我正在尝试编写一个在BLL和DAL之间有非常严格的边界的小应用程序,现在我想知道在层之间传递数据(域传输对象)的最佳方法是什么.

我在一个域级(类库)中实现了一些由BLL和DAL访问的类.这些类基本上只包含属性/数据成员,并且当前反映DAL数据.例如:

class CustomerData
{
  // some data fields
}
Run Code Online (Sandbox Code Playgroud)

然后我在BLL中实现了一些类:

class Customer : CustomerData
{
  // Some methods
}
Run Code Online (Sandbox Code Playgroud)

在我的DAL中,我通过Linq-to-Sql从数据库中获取客户记录.然后我通过以下方式将linq对象映射到我的Domain对象:

CustomerData.field = LinqObject.field
// Etc
Run Code Online (Sandbox Code Playgroud)

因此,我的想法是,当我请求时,我现在是一个从DAL到BLL的CustomerData实例(并且我应该将Customer实例传递给我的UI).

因此,在我的BLL中,我将收到一个CustomerData实例,但现在我想让客户摆脱它.

问题:

  1. 我现在必须在我的BLL中创建一个Customer实例并且AGAIN复制所有字段成员吗?
    客户c =新客户; c.field = CustomerData.field;
  2. 如何在没有字段复制步骤的情况下从CustomerData创建客户?
  3. 我应该更喜欢使用构图吗?
    class Customer {CustomerData Data; }
  4. 在我当前的布局中有没有更有效的方法(更少编码等)?
  5. 有没有更好的方法来做到这一点?
  6. 一般的评论?

谢谢 !

c# dns user-interface data-access-layer bll

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

在网站上加载谷歌地图的最佳方式

我正在使用谷歌地图v3,并希望它加载更快.

我的设置:

在.js文件的末尾

google.maps.event.addDomListener(window, 'load', initialize);
Run Code Online (Sandbox Code Playgroud)

并在HTML页面代码的末尾:

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
Run Code Online (Sandbox Code Playgroud)

如何让地图更快地出现在屏幕上?

javascript google-maps

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

合并SQL Server中的日期间隔

我有以下数据:

StartDate   |  EndDate
-------------------------
1982.03.02  |  1982.09.30 
1982.10.01  |  1985.01.17 
1985.06.26  |  1985.07.26 
1985.07.30  |  1991.12.31 
1992.01.01  |  1995.12.31 
1996.01.01  |  2004.05.31 
2004.06.05  |  2006.01.31 
2006.02.01  |  2011.05.20              
Run Code Online (Sandbox Code Playgroud)

我需要合并任何相邻的区间(开始日期和结束日期都包含在区间中,因此结束于2003.05.06的区间与2003.05.07开始的区间相邻),所以在这种情况下,结果集合应该:

StartDate   |  EndDate
-------------------------
1982.03.02  |  1985.01.17 
1985.06.26  |  1985.07.26 
1985.07.30  |  2004.05.31 
2004.06.05  |  2011.05.20              
Run Code Online (Sandbox Code Playgroud)

对我来说,显而易见的方法是使用游标迭代集合,并逐行构造结果集.但是,此功能将位于可能在一天内在重负载的服务器上被调用数千次的代码内,因此我不希望出现任何性能问题.任何数据集都很小(20行顶部),数据范围很大,因此任何生成范围内所有日期的解决方案都是不可行的.

有没有更好的方式我没有看到?


初始化代码(来自Damien的回答):

CREATE TABLE Periods (
    StartDate datetime NOT NULL CONSTRAINT PK_Periods PRIMARY KEY CLUSTERED,
    EndDate datetime NOT NULL
)

INSERT INTO Periods(StartDate,EndDate)
SELECT '19820302', '19820930'
UNION ALL SELECT '19821001', '19850117'
UNION ALL …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server

4
推荐指数
2
解决办法
6993
查看次数

将泛型类型参数限制为System.Enum

我有一个泛型类型,应该用Enum类型指定(实际上,它是几个指定枚举之一,但我会满足System.Enum).

当然编译器会在代码中发挥作用:

class Generic<T> where T : Enum {}
Run Code Online (Sandbox Code Playgroud)

"约束不能特殊的类'System.Enum'"例外.

到目前为止我唯一能够提出的解决方案是使用静态类型初始值设定项来检查类型参数,如果事实上不是枚举,则抛出异常,如下所示:

class Generic<T> 
{
  static Generic()
  {
    if (typeof(T).BaseType != typeof(Enum))
      throw new Exception("Invalid Generic Argument");
  }
}
Run Code Online (Sandbox Code Playgroud)

至少给了我运行时安全性,它不会与非枚举参数一起使用.然而,这感觉有点hacky,所以是否有更好的方法来实现这一点,理想情况下使用编译时构造?

c# generics enums

4
推荐指数
1
解决办法
1175
查看次数

限制对只读属性的方法调用的访问

我有一个类,它定义了一个只读属性,可以有效地公开一个私有字段,如下所示:

public class Container
{
    private List<int> _myList;

    public List<int> MyList
    {
        get { return _myList;}
    }

    public Container() : base ()
    {
        _myList = new List<int>();
    }

    // some method that need to access _myList
    public SomeMethod(int x)
    {
         _myList.Add(x);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在消费者不可能直接管理我的属性,所以代码如aContainer.MyList = new List(); 生成编译时错误.但是,消费者可以完全自由地在他所获得的引用上调用各种方法,因此这是完全有效的代码

Container c = new Container();  
Console.WriteLine(c.MyList.Count);  
c.MyList.Add(4);  
Console.WriteLine(c.MyList.Count);  
Run Code Online (Sandbox Code Playgroud)

哪种打败了整个只读概念.

是否有任何理智的解决方法可以让我有一个真正的只读参考属性?

PS我不能只返回列表的副本,因为用户会认为他做了所有必要的更改,但唉...他们将会消失.

c# properties readonly

3
推荐指数
1
解决办法
980
查看次数

使用COM Interop反射

在互操作调用之后,我找回了一个COM对象.我知道这个对象将是三个可能的COM类之一(Class1,Class2,Class3),但不知道哪个在运行时.

对该对象的反射(interopObject.GetType())返回System .__ ComObject的基本RCW包装器.

我需要的是在对象上设置一些属性 - Text1,Text2,... Text30(实际名称,btw :)),它们存在于所有三个类中.

所以,问题是,我可以以某种方式获取对象的运行时类型(这将解决我的问题,但可能是不可能的,因为.net运行时可能没有该信息),或者我可以设置COM对象的属性盲目地

这是我当前的代码,它失败了:

for ( int i = 1; i <= 30; i++ )
{
  ProprertyInfo pi =interopObject.GetType().GetProperty("Text" +i.ToString()) 
  // this returns null for pi
  pi.GetSetMethod().Invoke(interopObject, new object[] { someValue });
}
Run Code Online (Sandbox Code Playgroud)

感谢Marc,这三个进入我的永久噱头系列:

private static object LateGetValue(object obj, string propertyName)
{
  return RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(obj, null,
            propertyName, new object[0], null, null, null));
}

private static void LateSetValue(object obj, string propertyName, object value)
{
  NewLateBinding.LateSet(obj, null, propertyName, new []{value}, null, null);
}

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

c# com reflection interop

3
推荐指数
1
解决办法
3702
查看次数

将字符串转换为datetime问题

我正在尝试将一种格式的日期字符串转换为另一种格式.但是,我收到此异常错误消息

字符串未被识别为有效的DateTime.

我的代码如下:

string theDate = "28-Feb-13 4:00:00 PM";

DateTime tempDate = DateTime.ParseExact(theDate, "dd-MMM-yy hh:mm:ss tt", CultureInfo.InvariantCulture, DateTimeStyles.None);

convertedDate = tempDate.ToString("yyyy/MM/dd hh:mm:ss");
Run Code Online (Sandbox Code Playgroud)

我真不知道出了什么问题.

c#

3
推荐指数
1
解决办法
266
查看次数

我不能从另一个类调用公共方法

这是带方法的类

public partial class NewGame : Form
{
  public NewGame()
  {
    InitializeComponent();
    this.Icon = new Icon("Resources/iconG.ico");
    comboBoxGenre.Items.AddRange(Enum.GetNames(typeof(Game.Genre)));
  }

  public string GetGameName()
  {
    return txtbxGameName.Text.Trim();
  }

  public int GetGenreSelector()
  {
    return comboBoxGenre.SelectedIndex;
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的主要形式

private void addGameToolStripMenuItem_Click(object sender, EventArgs e)
{
  Form newGame = new NewGame();
  newGame.ShowDialog(this);
  if (newGame.DialogResult==DialogResult.OK)
  {
    string gameName = newGame.GetGameName(); //this part doesn't work
  }
}
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息:

错误
1'System.Windows.Forms.Form'不包含'GetGameName'的定义,并且没有扩展方法'GetGameName'接受类型'System.Windows.Forms.Form'的第一个参数可以找到(你错过了吗?使用指令或程序集引用?)

几个星期前我写了类似的代码,它完美无缺.

c# winforms

3
推荐指数
1
解决办法
1748
查看次数

是设计模式吗?链

如何调用该类\结构?也许是设计模式?

任务:
我有一个我需要搜索项目的集合.
我有3个级别的搜索.
我创建一个Matcher链并在每个级别上搜索集合,如果找不到则将集合传递到下一级别.

我正在寻找什么是设计模式.

class Matcher
{
    private readonly Matcher _nextMatcher;
    private readonly Func<lambda, bool> _predicate;

    public Matcher(
        Matcher nextMatcher,
        Func<lambda, bool> predicate)
    {
        _nextMatcher = nextMatcher;
        _predicate = predicate;
    }

    public bool Match(Collection<SomeObject> someObjects,
        IEnumerable<SomeObject> sourceObjects)
    {
        if (!_predicate(someObjects, sourceObjects))
        {
            if (_nextMatcher == null)
                return false;

            return _nextMatcher.Match(someObjects, sourceObjects);
        }

        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

c# design-patterns

3
推荐指数
1
解决办法
101
查看次数

如何确定值是否为零?

我有一个值为盒装(任意)数字类型或可以为空的数字类型.我需要检查该值是否为零.

基本上我有这个:

public bool IsZero(object value)
{
   if (value == null)
            return false;

   //lifted from the mvc sources, so I guess it's exhaustive
   HashSet<Type> numericTypes = new HashSet<Type>(new Type[] {
        typeof(byte), typeof(sbyte),
        typeof(short), typeof(ushort),
        typeof(int), typeof(uint),
        typeof(long), typeof(ulong),
        typeof(float), typeof(double), 
        typeof(decimal)
    });

   Type type = Nullable.GetUnderlyingType(value.GetType()) ?? value.GetType();

   if (!numericTypes.Contains(type))
      return false;

   // how do I get the value here ?
}
Run Code Online (Sandbox Code Playgroud)

我没有看到一种简单的方法来比较int值和int零,以及一个字节值为0的字节值.

我看到的一个解决方法是将正确键入的零值与每种类型相关联并检查,但是如果我最终需要一个"IsOne"方法,我想重用该解决方案.

c#

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