Tag: design patterns

DI和存储库模式

目前,我的代码与此类似(缩短只是为了说明一点): DAL 存储库接口 public interface IRepository { IList GetAll(); TEntity Get(TKey id); TEntity Add(TEntity item); TEntity Update(TEntity item); bool Remove(TKey id); } 基本EF存储库 public class BaseEFRepository : IRepository where TEntity: class, IEntity where TKey: struct { protected readonly DbContext _dbContext; public BaseRepository() { _dbContext = new MyDB(); _dbContext.Configuration.ProxyCreationEnabled = false; _dbContext.Configuration.LazyLoadingEnabled = false; } public […]

试图通过使用Singleton来确定此代码是否会带来任何好处

我正在开发一个项目,其中一个联合开发人员(以及之前的开发人员)使用Singleton / Facade几乎每个页面的内部都有很多方法调用,但实际上并没有维护数据。 例如: public class FooFacade { private static FooFacade m_facade = null; private static DataAccessManager m_dataAccessMgr = null; public StringBuilder Status {get; set; } private FooFacade() { this.Status = new StringBuilder(); } public static FooFacade getInstance() { if (m_facade == null) { m_dataAccessMgr = DataAccessManager.getInstance(); m_facade = new FooFacade(); } return m_facade; } […]

如何以通用forms实现NULL对象设计模式?

有没有办法以通用forms实现空对象设计模式,这样我就不需要为每个商务对象实现它。 对我来说,每个商务课程都需要两个高级课程。 一个用于单个记录,另一个用于列表。 所以我认为应该有一种方法可以在高级别实现NULL Object设计模式,而不必为每个类实现它。 请问有什么方法吗?

我什么时候需要管理托管资源?

我一直在看标准的Dispose模式,我只是想知道我需要写什么来免费管理资源? 如果这些资源已经“管理”,那么我肯定不需要做任何事情。 如果是这种情况,并且我的类没有任何非托管资源(因此不需要GC最终确定)那么我只需要在Dispose方法中抑制终结吗? : – public void Dispose() { GC.SuppressFinalize(this); } 所以假设这是我的class级: public sealed class MyClass : IDisposable { IList objects; // MyObject doesn’t hold any unmanaged resource private bool _disposed; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { if (!_disposed) { // do I need to set the list to […]

使用标准.Net异步模式的优点?

我正在设计一个执行长时间运行任务的类。 我想出的第一个设计是: public TaskHandle DoSomethingAsync(DoSomethingCompleteCallback completedCallback); public void CancelDoSomething(TaskHandle handle); 这简单而简洁。 但是,我想知道我是否应该将其作为我一直在阅读的标准.Net异步模式之一来实现? APM: public IAsyncResult BeginDoSomething(AsyncCallback completedCallback, Object stateObject); public void EndDoSomething(IAsyncResult asyncResult); EAP: public void DoSomethingAsync(string param, object userState); public event DoSomethingCompletedEventHandler DoSomethingCompleted; IMO这些似乎使界面变得复杂,除了作为其他.Net开发人员可识别的模式之外没有任何实际优势。 APM要求客户端代码始终在其completedCallback中调用EndDoSomething(),并且EAP需要单独订阅已完成的事件。 如果有的话,使用我缺少的标准模式有什么好处?

我可以将成员定义/约束为实现两个接口,而不是generics吗?

以下代码显示了我想要做的事情; 也就是说,我想约束anObject,以便它可以用作各种方法的参数,使用IInterfaceOne或IInterfaceTwo,其中两者都不从另一个inheritance。 public interface IInterfaceOne { } public interface IInterfaceTwo { } public class Implementation : IInterfaceOne, IInterfaceTwo { } public interface IInterfaceOneAndTwo : IInterfaceOne, IInterfaceTwo { } public class UsingImplementation { IInterfaceOneAndTwo anObject = (IInterfaceOneAndTwo)(new Implementation()); //fails because Implementation doesnt acctually implement IInterfaceOneAndTwo } 但是这个例子失败了,因为IInterfaceOneAndTwo本身就是一个接口,而Implementation并没有实现它。 我知道如果我使用generics我可以约束它们,但我想知道,如果有一种方法可以做到这一点没有generics? 有没有办法说anObject应该实现IInterfaceOne和IInterfaceTwo ,而不使用IInterfaceOneAndTwo ?

MonoState,Singleton或Derived Forms:CRUD应用程序的最佳方法?

我有一个相当大的CRUD WinForm应用程序,有很多对象。 人员,报名,计划,案例注释等 。 应用程序中有超过30种表单,逻辑上分解了UI。 会员,注册,计划,CaseNotes等 。 我试图找出如何在搜索表单上搜索并将该对象传递给下一个请求的表单后如何创建我的Person对象 。 无论那是什么,让我们说人口统计学 。 缺点是我需要Person对象在整个App中可用,并且只能有一个。 现在我有ZERO接触设计模式,但我正在尝试。 我已阅读http://www.switchonthecode.com/tutorials/csharp-tutorial-singleton-pattern和http://www.yoda.arachsys.com/csharp/singleton.html但我想确保我理解正确将此应用于我的情况。 首先,示例说明您正在访问引用 ,对吗? 我错了还是需要访问该值 ? 其次,还有什么我需要做的才能使全球可用吗? 我只是在每个表单上声明一个实例,但通过这个Singleton模式,以便没有多于一个? 谢谢 编辑1 为了澄清,所有对象都是Person的子对象。 此外,正如搜索页面所躲避的那样; 用户可以选择不同的currentPerson。 但他们一次只能与一个人互动。 最后,正如我所说的那样,我是一个婴儿,如果我应该考虑其他事情,请说明一个不同的方法,如果你愿意提供一些解释,为什么,我会非常感激。 编辑2 根据Medicine Man的评论我认为我已经澄清了。 首先,感谢迄今为止贡献的所有人。 其次,我不知道关于设计模式的第一件事,如果在我目前的情况下需要某一个,我当然没有最模糊的。 如果有人有一个更好,更简单,或者,在您看来,更合适的方法将数据对象从FORM传递到FORM到FORM然后请告诉。 最后,我需要一种跟踪信息的方法,因为我的用户从一个地方到另一个地方。 谢谢

如何比较具有相似属性的两个截然不同的对象

这完全在C#中,使用.NET 2.0。 我有两个对象列表。 它们不是相关对象,但它们确实具有可以比较的某些共同点,例如基于Guid的唯一标识符。 这两个列表需要由另一个列表过滤,该列表只包含Guid,它可能与前两个列表中包含的ID匹配,也可能不匹配。 我已经想过将每个对象列表转换为’对象’并按此排序的想法,但是我不确定一旦它被转换我将能够访问ID属性,并且我在想这个方法在知道要排序的列表是什么时,对两个列表进行排序应该有些愚蠢。 引入每个对象列表的最佳方法是什么,以便可以仅使用ID来对列表进行排序?

构造函数链接中间变量

我有以下的重载构造函数,我正在努力找到一个很好的解决方案。 我看不到如何使用构造函数链接的中间赋值。 以下内容无效,但显示了我想要做的事情 public MyThing(IServiceLocator services, int? userId) { // blah…. } public MyThing(IServiceLocator services, string userName) { User user = services.UserService.GetUserByName(userName); int userId = user == null ? null : (int?)user.Id; // call the other constructor this(services, userId); } 我知道在有效代码中编写上述内容的唯一方法是 public MyThing(IServiceLocator services, string userName) : this(services, services.UserService.GetUserByName(userName) == null ? null : (int?)services.UserService.GetUserByName(userName).Id) […]

为工作流应用程序推荐设计模式

我正在开发一个用户可以执行任务/工作流的应用程序。 每个任务都由要执行的操作队列组成。 我希望能够在工作流程启动后能够输入用户。 例: 任务开始 Action1启动 Action1结束 Action2启动 Action2结束 Action3需要用户输入(UI打开窗口以获取用户输入) Action3获取用户输入 Action3开始了 Action3结束 任务结束 我正在开发这个C#,我知道Workflow Foundation和C#中的任务。 它们可能有我需要的东西,但我也有兴趣听到从头开始这样做的设计模式。