Tag: 设计模式

C#数据库包装器设计

我正在为C#设计一个数据库包装器。 以下是我的两个选项: 选项A: class DBWrapper:IDisposable { private SqlConnection sqlConn; public DBWrapper() { sqlConn = new SqlConnection(“my connection string”); sqlConn.Open(); } public DataTable RunQuery(string Sql) { implementation…… } public Dispose() { if(sqlConn != null) sqlConn.Close(); } } 选项B: class DBWrapper { public DBWrapper() { } public DataTable RunQuery(string Sql) { SqlConnection sqlConn = new SqlConnection(“my connection […]

从抽象基类返回规范表示子类是否可以接受?

编辑2: TL; DR :有没有办法不打破OO最佳实践,同时仍然满足一系列相同类型的东西必须转换为类似规范的东西的约束? 此外,请记住,我的问题是关于一般情况,而不是具体的例子。 这不是一个家庭作业问题。 假设您有以下内容: 实现通用function的抽象基类; 一个具体的派生类,用作规范表示。 现在假设您希望基类的任何inheritance者可以转换为规范表示。 实现此目的的一种方法是在基类中使用一个抽象方法,该方法旨在将inheritance者的转换作为规范派生类的实例返回。 但是,似乎普遍认为基类不应该知道它们的任何派生类,并且在一般情况下,我同意。 但是,在这种情况下,这似乎是最好的解决方案,因为它允许任意数量的派生类,每个派生类都有自己的实现,我们不需要知道任何事情,通过转换为每个派生的规范表示可以互操作class必须实施。 你会以不同的方式做吗? 为什么以及如何? 几何点的示例: // an abstract point has no coordinate system information, so the values // of X and Y are meaningless public abstract class AbstractPoint { public int X; public int Y; public abstract ScreenPoint ToScreenPoint(); } // a point in […]

Singleton httpclient vs创建新的httpclient请求

我想在我的Xamarin.Forms移动应用程序中使用HttpClient创建web服务层。 没有单一模式 单身模式 在第一种方法中,我在移动应用程序发出的每个新请求中创建新的http客户端对象。 这是我的代码 public HttpClient GetConnection() { HttpClient httpClient = new HttpClient(); httpClient.BaseAddress = new Uri(baseAddress); httpClient.Timeout = System.TimeSpan.FromMilliseconds(timeout); return httpClient; } 发布请求代码 public async Task PostAsync(String url, TRequest requestData) { HttpClient client = GetConnection(); String responseData = null; if (client != null) { String serializedObject = await Task.Run(() => JsonConvert.SerializeObject(requestData, _jsonSerializerSettings)); var […]

更换大开关?

我有一个名为“ReportController.aspx”的页面,其目的是基于查询字符串参数实例化报表(类) switch (Request.QueryString[“Report”]) { case “ReportA”: CreateReportAReport(“ReportA’s Title”); break; case “ReportB”: CreateReportBReport(“ReportB’s Title”); break; case “ReportC”: CreateReportCReport(“ReportC’s Title”); break; case “ReportD”: CreateReportDReport(“ReportD’s Title”); break; … 基本上,每次需要新报告时,都会有添加案例和添加方法的开销。 这个switch语句可能会变得非常长。 我读过可以使用Dictionary将报告映射到?。 这看起来如何使用字典(假设这是一种更好的方法)。 此外, CreateReportXReport方法基本上将一堆额外的QueryString值传递给报表类的构造函数(每个报表类都有不同的构造函数)。

设计一个可变类,在它被消耗后变为不可变类

假设场景不允许实现不可变类型。 按照这个假设,我想了解如何正确设计一个在消费后变成不可变的类型的意见/例子。 public class ObjectAConfig { private int _valueB; private string _valueA; internal bool Consumed { get; set; } public int ValueB { get { return _valueB; } set { if (Consumed) throw new InvalidOperationException(); _valueB = value; } } public string ValueA { get { return _valueA; } set { if (Consumed) throw new […]

C#尝试捕获模式帮助

我们总是需要尝试捕获我们的代码,它变得丑陋像 public void foo() { try { DoSomething(); } catch(Exception e) { //do whatever with e } } public int FooReturnInt() { try { return IntAfterSomeCalculation(); } catch(Exception e) { //do exactly whatever with e as foo() } } 想象一下,我们有一个庞大的类,有许多像这样的公共函数,我们必须在每个函数中应用相同的try catch。 理想情况下,因为try catch部分是相同的,我们可以将Func 作为参数传递给辅助函数,它可以像 public void TryCatch(Func theFunction) { try { theFunction(); } catch(Exception e) […]

这种使用generics的模式有名称吗?

//this class (or interface if you like) is set up as generic… public abstract class GenericBase { public T PerformBasicTask(T in) { … } } //… but is intended to be inherited by objects that close the generic… public class ConcreteForDates:GenericBase { public DateTime PerformSpecificTask(DateTime in) { … } } //… so that consuming code […]

变量= null作为“对象破坏”来自何处?

我在不同的公司中使用不同版本的.NET编写的许多遗留系统,我一直在寻找以下模式的示例: public void FooBar() { object foo = null; object bar = null; try { foo = new object(); bar = new object(); // Code which throws exception. } finally { // Destroying objects foo = null; bar = null; } } 对于任何知道内存管理如何在.NET中工作的人来说,这种代码是非常不必要的; 垃圾收集器不需要您手动分配null来告诉可以收集旧对象,也不需要分配null指示GC立即收集对象。 这种模式只是噪音,因此很难理解代码试图实现的目标。 那么,为什么我一直在寻找这种模式呢? 是否有一所学校教授这种做法? 是否存在一种语言,其中需要为本地范围的变量分配null值才能正确管理内存? 是否有一些额外的值明确指定null我还没有认识到?

MVC和Observer模式

我在项目中实现Observer模式时遇到问题。 该项目必须在C#中作为MVC制作,就像Windows应用程序一样。 在我的域模型中,我有例如Country类和Country存储库。 我有一个国家/地区控制器和视图,可以查看所有国家/地区(表单上的列表),添加新国家/地区以及修改现有国家/地区。 我不知道有多少观点需要了解与改变国家有关的变化。 事情是我必须使用Observer模式。 在网络上,当主题为国家而观察者是一个正在编辑国家且所有示例都在控制台应用程序中的表格时,我只能找到检查。 我需要所有拥有国家名单的表格都知道添加新国家,而不仅仅是编辑现有国家。 如果我将存储库设为主题,我该怎么做呢?

当您需要两个用户控件(winforms)进行通信时的最佳实践

扩展问题 除了下面指定的原始问题之外,我还想添加一个新问题。 应用程序中的一个用户控件包含我需要从另一个用户控件访问的对象列表。 如何才能做到这一点? (我不相信控制的划分很好,但我宁愿不改变它……) 我应该通过事件和原始问题一起做,还是应该抓住父窗体,并使用它来查找控件的实例,并将其作为属性公开? 原来的问题 我有一个表单中的两个用户控件,我希望能够相互通信。 Usercontrol A应该能够在B上启动操作。 解决这个问题的首选方法是什么? 表单应该从A等待事件,然后在B上开始操作吗? 这有什么设计模式吗? 或者它是一个更简单的解决方案? 提前致谢! 🙂