Tag: design patterns

通用基类包装嵌套generics类以减少类型参数规范:此模式是否有名称?

好的问题标题远非不言自明。 我看到自己经常这样做: 从这个答案 : public static class Equality { public static IEqualityComparer CreateComparer(Func keySelector) { return new KeyEqualityComparer(keySelector); } class KeyEqualityComparer : IEqualityComparer { readonly Func keySelector; public KeyEqualityComparer(Func keySelector) { this.keySelector = keySelector; } public bool Equals(T x, T y) { —- } public int GetHashCode(T obj) { …. } } } 我做了什么:我必须调用一个实现细节KeyEqualityComparer : […]

dependency injection的方式

可以将工厂模式(工厂方法,简单工厂方法和抽象工厂)或服务定位器模式获取依赖关系称为dependency injection。 我的理解是通过这种实例化依赖关系的方式,高级类仍然需要了解有关Factory或Service定位器的信息。dependency injection意味着依赖项被推送而不是不同于Factory类型,并且最好的方法是使用Inversion控制容器,如NInject,Unity,CastleWindsor等。请分享您的观点。

锁定超时模式

lock使用这种模式 if(Monitor.Enter(lock)) try { … } finally { Monitor.Exit(lock); } // using this style to reduce post “height” 如果我们不想等待无限,我们可以提供超时 if(!Monitor.TryEnter(lock, timeout)) throw new TimeoutException(); try { … } finally { Monitor.Exit(lock); } 我有方法,方法必须在开始做任何事情之前获得多个锁。 这看起来很糟糕: if(!Monitor.TryEnter(lockA, timeout)) throw new TimeoutException(); try { if(!Monitor.TryEnter(lockB, timeout)) throw new TimeoutException(); try { if(!Monitor.TryEnter(lockC, timeout)) throw new TimeoutException(); try { […]

为什么ICollection 同时实现IEnumerable 和IEnumerable

为什么ICollection实现IEnumerable和IEnumerable ? 这样做的目的是什么? IEnumerable如何使ICollection受益?

如何解耦模式切换和命令

如何将模式(通常由枚举表示)与命令及其关系中的实现分离? 它们是一个很好的模式,用于描述模式开关(int,enum,string,…)与其命令调用之间的松散绑定吗? 我想通过配置添加模式,因此必须(动态)轻松扩展(无需编程)。 我已经知道命令模式(C#/ .Net中的ICommand)。 它可能是一个命令字典及其相关的模式编号,但是切换逻辑呢?

我可以使用装饰器模式来包装方法体吗?

我有一堆不同签名的方法。 这些方法与脆弱的数据连接交互,因此我们经常使用辅助类来执行重试/重新连接等。如下所示: MyHelper.PerformCall( () => { doStuffWithData(parameters…) }); 这工作正常,但它可以使代码有点混乱。 我更喜欢做的是装饰与数据连接交互的方法,如下所示: [InteractsWithData] protected string doStuffWithData(parameters…) { // do stuff… } 然后基本上,每当doStuffWithData ,该方法的主体将作为Action传递给MyHelper.PerformCall() 。 我该怎么做呢?

每个请求的上下文:如何更新实体

我有一个存储库类,如下所示。 有一种获取实体对象的方法 – GetPaymentByID。 我正在检索Payment对象并对其PaymentType属性进行更改。 但这并没有反映在数据库中。 我知道原因 – SaveContextChanges方法使用新的上下文。 我需要使用Context Per Request方法。 因此,我在每种方法中创建新的上下文。 在这种情况下,如何修改代码以成功更新数据库? 注意:客户端程序不应使用ObjectContext,因为可以使用不使用Entity Framework的另一个存储库更改存储库 。 注意 :“ DataContext很轻,创建起来并不昂贵 ” namespace MyRepository { public class MyPaymentRepository { private string connectionStringVal; public MyPaymentRepository() { SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder(); sqlBuilder.DataSource = “.”; sqlBuilder.InitialCatalog = “LibraryReservationSystem”; sqlBuilder.IntegratedSecurity = true; // Initialize the EntityConnectionStringBuilder. EntityConnectionStringBuilder entityBuilder = […]

建议设计:应用程序中几乎每个对象都有loggger

我正在写一个应用程序。 我使用NLog进行日志记录。 在这个应用程序中几乎每个对象都可以写入日志。 我为此定义了受保护的成员: protected Logger logger; protected virtual Logger Logger { get { return logger ?? (logger = LogManager.GetLogger(this.GetType().ToString())); } } 在这种情况下,我需要为应用程序中的每个基类复制/粘贴此代码。 或者我看到其他选项:使用记录器定义特定于应用程序的根对象并将其子类化。 但在语义上这听起来是错误的,因为对我来说这不是真正的“是 – ”的情况。 有没有更好的选择?

如何生成GIF 256色调色板

我需要在C#中创建一个16 X 16可点击矩形的矩阵,然后用256色调色板(GIF)中的颜色填充每个矩形。 我只需要帮助就可以创建一个简单的类来生成256种颜色。

使用“中间洞”模式

我刚刚遇到了“中间的漏洞”模式,并且认为我可以使用它来删除一些重复的代码,特别是当我尝试对不同的方法进行基准测试并在每个方法之前和之后使用相同的代码时。 我能够使用下面的代码获得基础知识。 我从StartingMethod开始 ,其主要目标是调用MainMethod1和MainMethod2 ,但它是通过PrePostMethod实现的 。 我现在想知道的是如何传递参数并获得返回值。 任何帮助都会很棒。 谢谢。 代码: 公共静态类HoleInTheMiddle { public static void StartingMethod() { PrePostMethod(MainMethod1); PrePostMethod(MainMethod2); } public static void PrePostMethod(Action someMethod) { Debug.Print( “PRE”); 的someMethod(); Debug.Print( “邮报”); } public static void MainMethod1() { Debug.Print(“这是主要方法1”); } public static void MainMethod2() { Debug.Print(“这是主要方法2”); } }