Tag: 设计模式

创建松散耦合/可扩展的软件架构

我已经研究了好几个星期了。 我目前正在使用n层(3层)方法和工厂设计方法设计松散耦合的架构设计。 我的目标是将每个客户端的业务逻辑(ClientA.DLL,ClientB.DLL)放在单独的命名空间中,以便项目扩展,这意味着我可以修改/删除/添加特定客户端的业务逻辑而不会影响其他客户端,因为它们是不依赖于彼此。 然后,我使用客户端的唯一标识符(在数据库中维护的字符串值)通过Factory命名空间调用客户端的名称空间/类。 Factory.DLL还隐藏了每个客户端的逻辑,而BusinessAbstract.DLL则用作每个客户端的类将使用的布局或模板。 这是项目解决方案: 这是实际的代码: BusinessAbstract.DLL namespace BusinessAbstract { // the entity / data transfer object public class MemberDTO { public string MemberID { get; set; } public string MemberName { get; set; } } // the interface public interface IMaintainable { void Add(); void Edit(); void Delete(); } // the base abstract […]

今日热门,本周,本月 – 设计模式

我有一个系统显示按三个字段之一排序的条目,最受欢迎的今天,本周和本月。 每次查看条目时,分数增加1,从而改变顺序。 因此,如果条目1是新的并且今天被观看10次,其分数将是: Today: 10 Week: 10 Month: 10 当前的解决方案 目前我只有3个与每个条目相关联的字段,一个用于本周的另一个用于本周,另一个用于本月。 每次查看条目时,所有三个分数都会增加1。 在一天结束时,将日分数重置为0.在当前周结束时,将周分数设置为0,并且在当前日历月结束时,将月分数设置为0。 问题 虽然这种方法有用并占用空间很小,但由于两个原因,它并不理想: 1)在当前时段(日,周,月)结束时,该值一次性重置为0,这意味着每天00:00:00排名全部重置,所有每日分数都设置为0,在本周末和月末也是如此。 在每个月1日的00:00:00,所有分数被设置为0,从而丢失所有现有的排名数据。 2)因为月末通常在一周内(周一至周日),所以每周的分数在一周内被重置,导致每周分数高于每月分数。 可能解决方案 我可以使用每小时每小时的滚动小时计数器,用于根据当前小时指数计算当前日,周,月的分数。 Array size = 31 * 24 = 744 int16 values 所以在1日凌晨4点,视图将在几个小时内放置[4] hours[4]++ 然后,统计计算器将使用今天作为最后24个值的总和,并且本周分数将是最后(24 * 7)值的总和。 最后,本月将是最后(24 * 31)值的总和。 解决问题 解决方案1的主要问题是磁盘/内存要求。 我已经从当前解决方案中的3个32位值变为使用744个32位值。 即使我将它们改为in16,我仍然会在每个条目中使用更多的内存 Memory per Entry = 3 * 4 bytes = 12 bytes (Existing) Memory […]

在存储库模式的抽象类上使用接口的优势?

可能重复: 接口与基类 通常可以看到使用Interfaces实现的存储库模式 public interface IFooRepository { Foo GetFoo(int ID); } public class SQLFooRepository : IFooRepository { // Call DB and get a foo public Foo GetFoo(int ID) {} } public class TestFooRepository : IFooRepository { // Get foo from in-memory store for testing public Foo GetFoo(int ID) {} } 但你可以使用抽象类同样做到这一点。 public abstract class FooRepositoryBase […]

“处理程序”模式?

我遇到过一种被称为“处理程序模式”的设计模式,但我无法在任何地方找到对此模式的任何实际引用。 它基本上只是一个单方法接口,允许您轻松扩展后端function,而无需重新编译客户端。 对于必须处理许多不同类型请求的Web服务可能很有用。 这是一个例子: public interface IHandler { IDictionary Handle(IDictionary args); } args通常包括一个像“Action”这样的键,其值可以告诉implmentation要做什么。 可以传入额外的args以获取更多信息。 然后,impl传回客户端“应该”理解的任意args列表。 这是一种反模式,还是伪装的另一种模式? 这种设计是推荐的吗? 编辑:更多信息:我看到这个实现的方式,“根”处理程序将充当其他具体处理程序的调度员(也许?)。 根处理程序有一个“HandlerResolver”,它决定哪个具体的处理程序应该根据它的内容获取消息。 也许它实际上就像一个“调度员”模式,虽然我不知道这是否真的是一种模式。 我想它也可能在根目录中有一个责任链模式,允许你将一堆具体的处理程序链接在一起,然后让他们决定哪一个会处理它。

我怎样才能更好地设计这个? (避免使用面向对象设计的switch语句)

我对面向对象的设计有点了解,但我不确定如何在我的代码中使用这些原则。 这是我正在做的事情: public void Query(Agency agency, Citation queryCitation) { queryCitation.AgencyCode = agency.AgencyCode; switch (agency.ClientDb.Type) { case “SQL”: QueryOracle(agency, queryCitation); break; case “PIC”: QueryPick(agency, queryCitation); break; } } (其中大部分是来自NHibernate的对象。我正在使用遗留数据库系统并将其部分重构到代码库中。)显然,我可以在这里做一些不同的事情,这样我就不需要为不同的数据库提供重复的function了。具有相同输入的查询。 它应该根据代理对象知道是使用Oracle数据库还是选择数据库连接。 (如果你从未听说过Pick数据库,那么直到我开始在这里工作之前我都没有。我们通过HTTP请求对它进行查询,所以它不是SQL。) 我应该创建一个接口,例如名为“ClientDbConnection”,然后创建两个实现该接口的类,移动代码查询数据库,然后使用“agency.clientDb.Query(queryCitation)”替换整个函数? 我想我在这里大声思考,但对此的任何意见都将不胜感激。

当“更喜欢组合而不是inheritance”时生成传递代码

问题 假设我试图将手机模型化为普通手机和PDA的组合。 这是一种多重inheritance方案(手机是手机,它是 PDA)。 由于C#不支持多重inheritance,因此这几乎需要某种组合。 另外,让我们说我还有其他理由支持作曲。 我一直想知道:是否有任何工具可以自动生成所有不可避免的传递代码? 让我用一些实际的代码充实我的例子: 接口: public interface IPhone { public void MakeCall(int phoneNumber); public void AnswerCall(); public void HangUp(); } public interface IPda { public void SendEmail(string[] recipientList, string subject, string message); public int LookUpContactPhoneNumber(string contactName); public void SyncWithComputer(); } 实现: public class Phone : IPhone { public void MakeCall(int phoneNumber) […]

如何制作2个不兼容的类型,但具有相同的成员,可以互换?

昨天我们团队中的2个人带着一个不寻常的问题来找我。 我们在其中一个winforms应用程序中使用了第三方组件。 所有代码都已针对它编写。 然后,他们希望将同一供应商的另一个第三方组件合并到我们的应用程序中。 令他们高兴的是,他们发现第二个组件与第一个组件具有完全相同的公共成员。 但令他们沮丧的是,这两个组件具有完全独立的inheritance层次结构,并且没有实现通用接口。 让你好奇……好吧,让我好奇。 问题的一个例子: 不兼容的类型http://sofzh.miximages.com/c%23/www.freeimagehosting.net public class ThirdPartyClass1 { public string Name { get { return “ThirdPartyClass1”; } } public void DoThirdPartyStuff () { Console.WriteLine (“ThirdPartyClass1 is doing its thing.”); } } public class ThirdPartyClass2 { public string Name { get { return “ThirdPartyClass2”; } } public void DoThirdPartyStuff () { […]

validation设计模式

我正在为我们的一个部门提供数据validation实用程序,该实用程序具有以下要求。 – 动态添加新业务实体 – 动态地向实体添加新validation。 – 用于显示业务实体及其有效性列表的UI – 用户可以选择在所有或选定的业务实体有效性上启动validation。 – 如果任何validation失败,UI将显示validation错误消息。 – 即使任何validation失败,系统也应继续进行下一次validation,从而validation所有已配置的validation。 在搜索互联网后,我发现以下2个承诺设计模式,满足我的业务需求一个id装饰模式,另一个是命令链(又称责任链)。 现在我的问题是哪个更好? 有人有更好的主意吗? 谢谢

多个DbContext的存储库和工作单元模式的最佳实践

我计划使用ASP.NET MVC和Entity Framework 6(Code First / POCO)开发Web应用程序。 我还想在我的应用程序中使用通用存储库和工作单元模式。 此应用程序连接到两个以上的数据库,因此,我必须在应用程序中使用多个DbContext。 public class ContextOne : DbContext { public DbSet public DbSet } public class ContextTwo : DbContext { public DbSet public DbSet } public class ContextThree : DbContext { public DbSet public DbSet } public interface IRepository where T : DbContext { void Add(T entity) where T […]

如何进行递归搜索?

我有一个Task类,它可以有相同类型的子任务 public class Task { public DateTime Start { get; set;} public DateTime Finish { get; set;} public List Tasks {get; set;} public DateTime FindTaskStartDate(Task task) {} } 我应该如何执行递归搜索(也许linq)以找到具有最早开始日期的任务? 我最初的方法涉及太多的循环,它结束了一点点混乱,并迅速失控。 这是我的第二次尝试: public DateTime FindTaskStartDate(Task task) { DateTime startDate = task.Start; if(task.HasSubTasks()) { foreach (var t in task.Tasks) { if (t.Start < startDate) { startDate = […]