Tag: design patterns

用于公开通用接口的非generics版本的模式

假设我有以下界面来显示分页列表 public interface IPagedList { IEnumerable PageResults { get; } int CurrentPageIndex { get; } int TotalRecordCount { get; } int TotalPageCount { get; } int PageSize { get; } } 现在我想创建一个分页控件 public class PagedListPager { public PagedListPager(IPagedList list) { _list = list; } public void RenderPager() { for (int i = 1; i < […]

洋葱建筑

我正在为即将到来的内部应用程序设置一个项目结构,该应用程序试验了Palermo提出的Onion Architecture( http://jeffreypalermo.com/blog/the-onion-architecture-part-3/ )。 我遵循他的指导方针,但到目前为止我需要对项目结构进行一些validation。 在图表之前,问题: 我认为参考文献都是正确的(根据图表设置,箭头表示’有参考’),但有些validation会很好。 我应该在依赖性解析层中添加什么? 这是帮助者去的地方吗? 这引用了所有其他项目? Web服务和UI如何与DAL通信? (通过核心?怎么样?) 应该去哪里? [我知道的广泛问题……] 简化的概念图如下(文件夹代表名称空间):

使用Singleton模式到Linq到Sql数据上下文

我在Linq to SQL中有一些困惑。我正在寻找数据上下文类有时会给出以下exception的实际原因。 “已经有一个与此命令关联的开放数据阅读器必须先关闭 特别是在多任务环境中。大多数人都说,原因是,数据上下文不是线程安全。所有建议使用DataContex作为每个单元的工作。 请参考以下主题以获得最佳答案 跨多个线程的Linq-to-SQL数据上下文 但在我的情况下,我正在使用另一个类调用“A”,它是以Singleton模式实现的。这个类的目的是以单例方式提供数据上下文对象。我维护此类“A”的实例作为派生的全局实例类和使用特定实例调用Datacontex。 我的问题是, 我的方法调用会导致不受控制的内存增长吗? 根据我的理解,单例维护一个实例作为静态对象。如果我的假设是错误的,请给我很好的解释。 注意: 我的方法调用的任何方式也抛出相同的exception。所以我相信在这种情况下也会发生同样的问题。

复合设计模式:如何将结果从一个组件传递到另一个组件?

我有以下代码: interface IService { void Execute(); } class ServiceA : IService { public void Execute() { … } } class ServiceB : IService { public void Execute() { … } } class ServiceComposite : IService { List _services = new List(); public ServiceComposite() { _services.Add(new ServiceA()); _services.Add(new ServiceB()); } public void Execute() { foreach (IService […]

单例模式 – 默认属性

我一直在研究Singleton模式,因为它在Settings类中使用。 这是我的项目AccessTest的Settings.Designer.cs中的相关代码: internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); public static Settings Default { get { return defaultInstance; } } public string applicationSetting1 { get { return ((string)(this[“applicationSetting1”])); } } } 我不清楚的是为什么属性’applicationSetting1’是通过另一个属性’Default’访问的,为什么: var value = AccessTest.Properties.Settings.Default.applicationSetting1; 我正在运行VS2013 C#和4.5。

使用yield return处理Enumerable对象的正确模式是什么?

是否存在返回Enumerable中所有项的yield的标准模式? 我经常发现我的一些代码反映了以下模式: public IEnumerable YieldReturningFunction() { … [logic and various standard yield return] … foreach(object obj in methodReturningEnumerable(x,y,z)) { yield return obj; } } foreach循环的显式用法仅仅是为了向我返回可枚举的代码味​​道的结果。 显然,我可以通过显式构建一个Enumerable并将每个标准yield返回的结果添加到它以及添加methodReturningEnumerable的结果范围来放弃使用yield return来增加我的代码的复杂性。 这将是不幸的,因此我希望有一种更好的方法来管理收益率回报模式。

C#Dto构造函数和dependency injection

我想知道设计DTO对象构造函数的最佳实践是什么。 说我有这样的Dto对象: class CustomerDto { public string Name { get; set; } public string Surname { get; set; } public string Phone { get; set; } … } 有几种方法可以构造对象: 我可以声明一个构造函数: public CustomerDto(string name, string surname, string phone, …) { this.Name = name; this.Surname = surname; this.Phone = phone; … } 当您看到此构造函数并立即结束SRP(单一责任)违规时? 尽管这些属性都是相关的。 也可以说没有必要validation属性,因为这是一个DTO并且没有行为,而且行为应该放在这个映射的域对象上。 在C#中,我们还可以更优雅地构造此对象: var […]

c#中的静态类

在回答这个问题时( https://stackoverflow.com/questions/352317/c-coding-question#352327 ),它让我想知道…… 将静态类视为等效于实现单例模式的非静态类实例是否存在任何危险?

避免多种类似方法中的重复代码(C#)

大家问候! 我在C#中有一些非常类似的方法(可能会有几十个)。 它们都建立在几乎相同的模式上: ResultObjectType MethodX(…input parameters of various types…) { nesting preparation code here… { { resultObject = ExternalClass.GetResultForMethodX(input parameters of MethodX); } } nesting result processing code here … return resultObject; } 重复/相同的部分: ResultObjectType,准备代码,结果处理代码 。 不同部分: 调用ExternalClass方法,输入参数集(输入参数数量,类型)。 重要提示:我无法控制方法签名 – 无法更改它们。 我试图避免重复类似代码的所有块与这样的事情: ResultObjectType MethodX(…input parameters of various types…) { return UniversalMethod( new ExternalMethodDelegate(ExternalClass.GetResultForMethodX), input parameters […]

entity framework:获取Repository中的Subclass对象

我有以下模型对应于下面列出的数据库表。 经理是员工。 会计师也是雇员。 获取存储库中所有管理器的最佳方法是什么? 如何实现GetAllManagers()方法? TPT是否合适? 码 MyRepository.MyEmployeeRepository rep = new MyEmployeeRepository(); List e = rep.GetAllEmployees(); public class MyEmployeeRepository { private string connectionStringVal; public MyEmployeeRepository() { SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder(); sqlBuilder.DataSource = “.”; sqlBuilder.InitialCatalog = “LibraryReservationSystem”; sqlBuilder.IntegratedSecurity = true; // Initialize the EntityConnectionStringBuilder. EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); entityBuilder.Provider = “System.Data.SqlClient”; entityBuilder.ProviderConnectionString = sqlBuilder.ToString(); […]