Tag: design patterns

在C#中如何正确实现命令设计模式?

我正在研究设计模式,我目前正在研究命令模式。 这是我目前的代码: // this is the receiver class Calculator : IReceiver { int x; int y; CommandOptions command; public Calculator(int x, int y) { this.x = x; this.y = y; } public void SetAction(CommandOptions command) { this.command = command; } public int GetResult() { int result = 0; switch(this.command) { case CommandOptions.ADD: result = this.x […]

c#扩展方法 – 设计模式

我想知道C#扩展方法是否基于任何现有的设计模式。

在C#中实现方法装饰器

在python中可以实现function decorators来扩展函数和方法的行为。 特别是我正在将设备库从python迁移到C# 。 与设备的通信可能会产生错误,应该使用自定义exception重新启动。 在python我会这样写: @device_error_wrapper(“Device A”, “Error while setting output voltage.”) def set_voltage(self, voltage): “”” Safely set the output voltage of device. “”” self.__handle.write(“:source:voltage:level {0}”.format(voltage)) 此方法调用将扩展为 try: self.__handle.write(“:source:voltage:level {0}”.format(voltage)) except Error: raise DeviceError(“Error while setting output voltage.”, “DeviceA”) 使用此模式,您可以轻松地包装和扩展方法,而无需在每个方法中编写每个try-except子句。 是否可以使用C#实现类似的模式? 如果需要实现装饰器( device_error_wrapper ),请告诉我。

访客模式示例

public class Song { public string Genre { get; protected set; } public string Name { get; protected set; } public string Band { get; protected set; } public Song(string name, string band, string genre) { Name = name; Genre = genre; Band = band; } } public interface IMusicVisistor { void Visit(List items); } […]

限制每种方法的参数数量?

假设参数类型相同,那么方法的参数数量是否有经验法则? 我只是想知道我应该在哪里绘制线和我的替代品(即接口,数组等)。

我如何使用断路器?

我正在寻找在我的控制之外远程调用服务的方法,直到连接成功为止。 我也不想简单地设置一个定时器,每隔n秒/分钟执行一次动作,直到成功为止。 经过一系列研究后,似乎断路器模式非常适合。 我找到了一个使用Castle Windsor拦截器的实现,看起来很棒。 唯一的问题是我不知道如何使用它。 从我发现的关于该主题的几篇文章中,我能够找到的唯一用法示例是简单地使用断路器仅调用一次动作,这似乎不太有用。 从那看起来我需要在一段while(true)循环中使用断路器简单地运行我的动作。 我如何使用Windsor拦截器执行一个动作来调用外部服务,直到它成功而不会关闭我们的服务器? 有人可以填写缺失的部分吗? 这是我能想到的 while(true) { try { service.Subscribe(); break; } catch (Exception e) { Console.WriteLine(“Gotcha!”); Thread.Sleep(TimeSpan.FromSeconds(10)); } } Console.WriteLine(“Success!”); public interface IService { void Subscribe(); } public class Service : IService { private readonly Random _random = new Random(); public void Subscribe() { var a = _random.Next(0, […]

迁移到MVVM之前需要WPF知识

我从1年开始使用WPF开发Windows应用程序..我想开始使用MVVM模式。 什么是令人兴奋的事我应该亲自动手开始MVVM模式? (欢迎任何有趣的链接)

如何在列表中应用多个过滤条件(同时)?

我使用.Net 4.0框架跟随C#代码。 这是在参考规范模式后由Jeff Perrin创建的 在GetProducts()中,要使用的条件在方法内定义(硬编码)。 还有另一种名为GetProductsBasedOnInputFilters()方法。 在此方法中,规范列表作为方法的参数。 题 在此方法中,在产品列表中应用这些filter的最佳方法是什么? 注意 :我尝试在foreach循环中应用FindAll子句并将结果添加到list 。 但是这种逻辑是不正确的 – 只需要返回那些满足所有条件的项目。 注意 :productSpeifications列表中的规格数量会因用户输入而异 注意 :“ 为Any()方法动态构建LINQfilter? ”中提到的方法似乎很有用。 但是我不知道如何在这里使用这种方法,因为我正在处理specifications列表; 不是generic delegates 。 过滤方法 public static class ProductFilterHelper { public static List GetProducts(List list) { double priceLimit = 100; //FIRST:: //List selectedList = list.FindAll(new OnSaleSpecification().IsSatisfiedBy); //SECOND:: //AndSpecification spec = new AndSpecification(new OnSaleSpecificationForProduct(), new […]

exception与ad-hoc类型。 什么可能会倒下?

我在阅读MVC 3项目时正在阅读企业应用程序的书籍开发。 我目前正在决定如何处理exception。 以前我会让exception在堆栈中冒泡,然后在最高层处理它。 本书建议在域模型中创建一个ad-hoc类并返回它。 例如 public sealed class MissingCustomer: Customer { } // On method failure return new MissingCustomer(); 我可以看到这个想法,但我正在努力certificate需要这个。 代码明智我同意返回一个新的缺失客户更简洁,而不是抛出exception。 您如何看待这种方法并且您遇到过哪种情况会产生重大影响? 如果我们假设客户必须始终存在,那么抛出一个例外说“嘿,客户应该总是存在而且由于某种原因它不存在,所以我将通知用户说某些特殊情况发生了”是有意义的。 另一方面,我可以假设客户可能被另一个人移除,因此我需要优雅地处理这个问题。 无论哪种方式,我认为我们需要一个MissingCustomer类或一个MissingCustomerException,因为客户是一个非常常见的实体,在整个系统中使用。 如果视图模型需要一个客户并且我们返回一个MissingCustomer – 它很好,因为inheritance将使这个工作。 例如,我有一个返回OrderViewModel的action方法。 此操作方法需要引用客户。 Customer customer = CustomerRepository.Find(10); if(customer == null) { return new MissingCustomer(); } 这将会失败因为action方法将返回OrderViewModel类型的视图模型,所以现在我更倾向于使用exception而不是MissingCustomer对象。 编辑 此外,MissingCustomer类型对象将从Customer类型inheritance属性。 我们唯一不需要这些属性,就是通知用户无法找到客户。 谢谢

通用单例

我有一个问题,这是制作Generic Singleton的正确方法吗? public class Singleton where T : class, new() { private static T instance = null; private Singleton() { } public static T Instancia { get { if (instance == null) instance = new T(); return instance; } } } 编辑: 检查一些PDF我发现一个通用的Singleton用另一种方式制作,这是另一个正确吗? public class Singleton where T : class, new() { Singleton() { } […]