Tag: design

您应该重用SqlConnection,SqlDataAdapter和SqlCommand对象吗?

我正在使用以类似于以下代码的布局编写的DAL对象。 我简化了很多代码只是为了显示设置。 public class UserDatabase : IDisposable { private SqlDataAdapter UserDbAdapter; private SqlCommand UserSelectCommand; private SqlCommand UserInsertCommand; private SqlCommand UserUpdateCommand; private SqlCommand UserDeleteCommand; private System.Data.SqlClient.SqlConnection SQLConnection; public UserDatabase() { this.SQLConnection = new System.Data.SqlClient.SqlConnection(ConnectionString); this.UserDbAdapter= new SqlDataAdapter(); this.UserDbAdapter.DeleteCommand = this.UserDeleteCommand; this.UserDbAdapter.InsertCommand = this.UserInsertCommand; this.UserDbAdapter.SelectCommand = this.UserSelectCommand; this.UserDbAdapter.UpdateCommand = this.UserUpdateCommand; } private bool FillUsers(DataSet UserDataSet, out int […]

流畅的NHibernate,关于代码设计的问题

Greeetings,我是Fluent NHibernate的新手。 让我们想象一下,有很多课程 ClassA的 ClassB的 ClassC … 创建模式后,我想获得一个创建表的列表。 例如: 打开表单 – >有一个表的名称,当我们点击每个表时,我们从这个表中获取记录。 我怎样才能做到这一点? 有更便宜的方式吗? 有可能没有反思吗? (解析所有课程,并获得它的名字)

扩展基本类型并自动更新实体的审核信息

我有一个实体模型,每个表都有审计信息(50多个表) CreateDate CreateUser UpdateDate UpdateUser 目前,我们以编程方式更新审计信息。 例如: if(changed){ entity.UpdatedOn = DateTime.Now; entity.UpdatedBy = Environment.UserName; context.SaveChanges(); } 但我正在寻找一种更自动化的解决方案。 在保存更改期间,如果创建/更新实体,我希望在将这些字段发送到数据库进行存储之前自动更新这些字段。 有关如何做到这一点的任何建议? 我宁愿不做任何反思,所以使用文本模板并非不可能。 已经提出了一种解决方案来覆盖SaveChanges并在那里进行,但是为了实现这一点,我要么必须使用reflection(我不想做)或者派生基类。 假设我沿着这条路走下去,我将如何实现这一目标? 例如 EXAMPLE_DB_TABLE CODE NAME –Audit Tables CREATE_DATE CREATE_USER UPDATE_DATE UPDATE_USER 如果我创建一个基类 public abstract class IUpdatable{ public virtual DateTime CreateDate {set;} public virtual string CreateUser { set;} public virtual DateTime UpdateDate { set;} public […]

ListBox使用MVVM滚动到视图中

我有一个非常简单的问题,但我无法弄清楚如何使用MVVM破解它。 我有一个绑定到ObservableCollection的ListBox 。 我运行一个进程,将一大堆项添加到集合中,因此它们显示在ListBox 。 问题是,当项目被添加到列表框…滚动条刚刚增长,但我似乎无法弄清楚如何使其添加到集合中的每个项目ScrollIntoView 。 此示例代码完美地说明了该问题。 XAML 查看模型 namespace Stack { using System; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Windows.Input; using GalaSoft.MvvmLight.Command; /// /// TODO: Update summary. /// public class MainWindowViewModel : INotifyPropertyChanged { private readonly BackgroundWorker _worker; private ICommand _commandName; private ObservableCollection _myValue = new ObservableCollection(); /// /// Initializes a new […]

扑克牌:它们应该是枚举还是结构或类?

我正在设计游戏网站,许多(希望成千上万)玩家将同时互相玩某些纸牌游戏。 甲板是标准牌52牌。 每张卡都有一套西装和一个等级。 这些卡片将被随机洗牌,处理,挑选,订购和播放。 我的问题是, Card应该是枚举,结构还是类? 对于枚举:让每张卡都是字节0..51。 因此卡片占用的空间非常小。 您可以将手表示为8字节的位集。 您可以在需要时非常快速地计算给定卡的套装和等级:即suit(n)= n / 13。 这将非常有效。 如果需要为Cards编写方法,请通过扩展方法编写。 对于struct:不,这就像编写机器代码一样。 卡是一种简单的结构,保存的数据非常少,不可变,很小。 它没有太多行为,因此将其作为结构并将其视为被动数据结构。 当需要时,您可以非常快速地从给定卡计算0..51中的索引。 对于课堂:不,这不是一种面向对象的思维方式。 制作卡片课程。 让它永恒不变。 准确创建52个实例。 让卡池保存这些实例。 因此,当需要黑桃皇后时,它会向卡片池询问。 即使有数千场比赛正在进行,也会有一个也只有一个黑桃皇后。 如果需要,可以在卡中存储索引字段0..51。 我倾向于最后一个选项(课程),但我不确定。 我不太担心表现; 在此过程中,我可能会犯更严重的错误。 我担心的是我的整个观点可能是错的; 也许这是一个非常简单的决定,我犹豫不决,因为我缺乏其他人拥有的一些知识。 你怎么看? 编辑:关于卡的行为。 我认为一张卡片只会知道其他卡片。 例如,它可以定义关于“谁击败谁在桥中”的部分顺序。 它不需要知道关于甲板的任何信息。 这将是服务器端代码; 当然,它不需要知道在屏幕上绘制等。

设计一个可以从F#中使用的C#库的指南

我只是想指出,这个问题不是相反的 设计F#库以供F#和C#使用的最佳方法 在这里,我不是要问如何设计一个用于两个世界的C#函数库。 我想知道什么样的设计选择包含或避免得到合理的折衷方案以使这个库可以从F#中使用的 良好实践 。 像(例如)的做法: 保持对象层次结构尽可能简单 避免改变对象的状态,但返回新的对象 等等… 任何已经完成它的人都可以分享它的经验吗? 边注 有趣的是,这个OSS项目IronJS 。 是的,它是用F#编写的,但是作者公开了两个专门的主机IronJS.Hosting.FSharp和IronJS.Hosting.CSharp 。

为什么API会返回’void’?

在编写API或可重用对象时,是否存在任何技术原因导致返回’void’的所有方法调用不应仅返回’this’(*在C ++中为此)? 例如,使用字符串类,我们可以做这样的事情: string input= …; string.Join(input.TrimStart().TrimEnd().Split(“|”), “-“); 但我们不能这样做: string.Join(input.TrimStart().TrimEnd().Split(“|”).Reverse(), “-“); ..beause Array.Reverse()返回void。 还有许多其他示例,其中API具有许多返回空白的操作,因此代码最终看起来像: api.Method1(); api.Method2(); api.Method3(); ..但完全有可能写: api.Method1().Method2().Method3() ..如果API设计师允许这样做。 遵循这条路线有技术原因吗? 或者它只是一种风格的东西,表示可变性/新对象? (x-ref 关于返回无效的文体问题 ) 结语 我接受了Luvieere的答案,因为我认为这最能代表意图/设计,但似乎有一些流行的API示例与此不同: 在C ++中cout << setprecision(..) << number << setwidth(..) << othernumber; 似乎改变了cout对象,以便修改插入的下一个数据。 在.NET中, Stack.Pop()和Queue.Dequeue()都返回一个项目,但也改变了集合。 ChrisW和其他人的道具,详细了解实际的性能成本。

WCF重试代理

我正在努力寻找实现WCF重试的最佳方法。 我希望尽可能让客户体验尽可能干净。 我知道有两种方法(见下文)。 我的问题是:“ 我缺少第三种方法吗?也许是一种普遍接受的做法? ” 方法#1 :创建实现服务接口的代理。 对于每次调用代理,请执行重试。 public class Proxy : ISomeWcfServiceInterface { public int Foo(int snurl) { return MakeWcfCall(() => _channel.Foo(snurl)); } public string Bar(string snuh) { return MakeWcfCall(() => _channel.Bar(snuh)); } private static T MakeWcfCall(Func func) { // Invoke the func and implement retries. } } 方法#2 :将MakeWcfCall()(上面)更改为public,并让消费代码直接发送func。 我不喜欢方法#1,每次接口更改时都必须更新Proxy类。 我不喜欢方法#2的是客户端必须将其调用包装在func中。 我错过了更好的方法吗? […]

良好的课堂设计

我正在尝试找出设计一个其属性保存在数据库中的类的最佳方法。 我们来看一个Person的基本例子。 要创建一个新人并将其放在数据库中,我希望DateOfBirth属性是可选的(即在DB中为NULL)。 这是我的示例代码: namespace BusinessLayer { class Person { public string FirstName { get; set; } public string LastName { get; set; } public DateTime DateOfBirth { get; set; } } } 我不确定这些领域是否应公开。 我应该这样做: class Program { static void Main(string[] args) { Person person1 = new Person(“Kate”,”Middleton”,null); } } 或者像这样: class Program { static […]

使用out / ref与return相比有什么好处?

我正在使用XNA框架制作一个游戏,所以我使用很多在向量上运行的函数。 (特别是Vector2 (64位结构))。 困扰我的是大多数方法都是用ref和out参数定义的。 这是一个例子: void Min(ref Vector2 value1, ref Vector2 value2, out Vector2 result) 我也觉得有点奇怪。 还有另一个明显更明显 public static Vector2 Min(Vector2 value1, Vector2 value2); 基本上,几乎所有的函数都有ref和s的重载。 类似的,其他API 。 这个设计有什么好处? XNA针对性能进行了优化,可能是结果吗? 说,Quaternion需要128b,其中ref更少。 编辑: 这是一个测试代码: public class Game1 : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; private Vector2 vec1 = new Vector2(1, 2); private Vector2 vec2 = new Vector2(2, […]