Tag: design patterns

我对MVVM模式有一些疑问

我的名字是来自西class牙的Jesús,我是一名.NET开发人员,几天前我刚刚发现了这个伟大的网站。 我对MVVM模式有一些疑问,如果你能回答它我会很高兴。 三个月前我开始使用WPF,我已经学会了MVP模式。 MVP非常好,因为您可以很好地构建应用程序。 我开始到处都看MVVM,但每个人都在用他自己的方法使用这个模式。 每个博主都在他们的WPF博客中讨论MVVM,但每个实现都是截然不同的。 我现在关注在CodePlex上使用MVVM工具包的实现,但我有疑问,我找不到太多信息。 我认为MVVM是MVP的变种。 使用MVP,每个视图都有一个执行视图工作的演示者。 在MVVM中,它是相同的,但只要你可以使用命令。 我也看到如果你需要一个活动,就像MVP一样; 将事件委托给演示者/视图模型,即它不是视图的作业(例如更新UI)。 另一方面,View-Model没有View引用,因此我必须更加努力地使用数据绑定。 您必须使用DelegateCommands(与RelayCommands相同,对吧?)。 嗯…更多问题……使用具有两个视图/用户控件的相同View模型是否安全? 哦……昨天我在玩MVVM时遇到了问题。 我创建了一个命令的CommandReference用于键绑定的东西,我将这个引用分配给我的按钮的命令属性,好吧, CanExecuted第一次工作但是当CanExecuted为真时它没有更新IsEnabled属性。 我通过将命令直接绑定到按钮而不使用引用来修复它。 问题是:为什么有些代码将引用链接到对象以及为什么其他代码直接绑定命令? 我应该学习哪些与MVVM有关的东西? (昨天我看到一些叫做附加行为的东西,但我不知道那是什么)。 我正在重写一个使用MVP开发的注释应用程序,但现在使用MVVM。 我将用命令替换事件(使用DelegateCommand),消除View模型上的视图引用,我认为这都是因为我看到MVVM的例子很像MVP。 好吧,如果你指出我对这种模式的所有误解,我将不胜感激。 谢谢你,将来我会帮助下一个MVVM新手:)

Factory Pattern可以构建许多派生类

我有一个工厂对象ChallengeManager来为我正在构建的游戏生成Challenge对象的实例。 有很多挑战。 每个Challenge类派生的构造函数都是不同的,但是它们之间有一个共同的接口,在基类中定义。 当我调用manager.CreateChallenge() ,它返回一个Challenge实例,它是派生类型之一。 理想情况下,我想在派生类本身内保留对象构造的代码,因此与该对象相关的所有代码都是共存的。 例: class Challenge {} class ChallengeA : Challenge { public static Challenge MakeChallenge() { return new ChallengeA(); } } class ChallengeB : Challenge { public static Challenge MakeChallenge() { return new ChallengeB(); } } 现在,我的ChallengeManager.CreateChallenge()调用只需要决定调用MakeChallenge()的类。 构造的实现包含在类本身中。 使用此范例,每个派生类都必须定义静态MakeChallenge()方法。 但是,由于该方法是静态的,我不能在这里使用接口,需要它。 这不是什么大问题,因为我可以很容易地记住为每个派生类添加正确的方法签名。 但是,我想知道是否应该考虑更优雅的设计。

在大型项目中使用通用存储库/工作单元模式

我正在开发一个非常大的应用程序。 该域有大约20-30种类型,实现为ORM类(例如EF Code First或XPO,对于该问题无关紧要)。 我已经阅读了几篇关于存储库模式的通用实现的文章和建议,并将它与工作单元模式相结合,产生了类似这样的代码: public interface IRepository { IQueryable AsQueryable(); IEnumerable GetAll(Expression<Func> filter); T GetByID(int id); T Create(); void Save(T); void Delete(T); } public interface IMyUnitOfWork : IDisposable { void CommitChanges(); void DropChanges(); IRepository Products { get; } IRepository Customers { get; } } 这种模式适合大型应用吗? 每个示例在工作单元中有大约2个,最多3个存储库。 据我了解的模式,在一天结束时,存储库引用的数量(在实现中初始化的延迟)与域实体类的数量相等(或几乎相等),因此可以使用工作单元复杂的业务逻辑实现。 例如,让我们像这样扩展上面的代码: public interface IMyUnitOfWork : IDisposable { […]

使用存储库时,ASP.NET MVC中业务逻辑的最佳位置是什么?

在ASP.NET MVC项目中为数据库实现Repository时,将业务逻辑放入其中是否正确,或者将逻辑放在控制器类中可能更好? 或者使用其他服务和帮助程序类来操作数据?

如何避免多个嵌套的IF

我目前正在尝试将我的程序重组为更多OO并更好地实现已知模式等。 我有很多嵌套的IF语句,想要摆脱它们。 我怎么能这样做? 我的第一个方法是用例外来完成它,所以例如 public static Boolean MyMethod(String param) { if (param == null) throw new NullReferenceException(“param may not be null”); if (param.Equals(“none”) || param.Equals(“0”) || param.Equals(“zero”)) throw new ArgumentNullException(“param may not be zero”); // Do some stuff with param // This is not executed if param is null, as the program stops a soon […]

工厂设计模式(需要批评)

我正在整理这个设计模式的解释和代码示例,试图帮助我周围的人抓住它(同时帮助自己掌握模式)。 我正在寻找的是对我的解释和代码示例的意见和批评……谢谢! 什么是工厂模式? 工厂模式利用特定的专用“对象创建者对象”来处理对象的创建 – 并且大多数时候实例化对象,类似于现实世界的工厂。 现实世界的例子 想象一下汽车工厂是各种类型汽车的创造者。 该汽车厂的一条assembly线可能有一天会生产一辆卡车,但是在另一天可能会重新生产汽车。 假设经销商向其指定的帐户处理部门下订单10辆汽车。 那个部门然后利用某个工厂并订购了10辆汽车。 账户处理人员并不关心自己制造汽车(想象效果不佳),他们只使用最终产品,确保经销商获得他们的车辆。 明年同一辆车的新车型出现,订单开始流入。账户处理人员(仍然不关心汽车的生产)下订单,但现在他们收到的汽车是不同的,assembly方法甚至是也许工厂可能会有所不同,但帐户处理人员不必担心这一点。 另外一个想法:车辆的工厂assembly商可能确切地知道如果某个帐户处理者下订单要采取什么行动(即,帐户处理者X下订单,工厂assembly工知道对于帐户处理者X,他们生产10辆Y型车辆)。 另一种选择可能是帐户处理程序告诉assembly工确切地生产什么类型的车辆。 如果帐户处理者也处理了车辆的创建(即它们被耦合),则每当车辆以任何方式改变时,每个帐户处理者将不得不在生产该车辆时进行再培训。 这会产生质量问题,因为有比工厂更多的帐户处理程序……会出现错误,费用会更高。 回到OOP 作为应用于软件工程的设计模式的对象工厂在概念上类似于上述示例…工厂生成各种类型的其他对象,您可以利用生成某种对象类型的assembly线(对象汇编器),返回到某种方式。 汇编程序可以检查请求客户端和句柄,或者客户端可以告诉汇编程序它需要什么对象。 现在……你正在一个项目并创建一个对象工厂和各种汇编程序,稍后在项目中,需求稍有变化,现在要求您更改对象内容以及客户端如何处理该对象。 由于您使用了工厂模式,这是一个简单的更改,在一个位置,您可以更改或添加工厂生成的对象,并更改汇编程序将对象内容放置的格式。 执行此操作的不幸方法是没有工厂方法,实例化每个对象实例并在客户端本身格式化对象内容…假设您在20个客户端中使用了此特定对象。 现在你必须去每个客户端,改变每个对象实例和格式……浪费时间……懒惰……第一次以正确的方式做到这一点,这样你就可以节省自己(和其他人)的时间并努力以后。 代码示例(C#) 以下是利用工厂生产食品和各种食品的例子 Factory module public enum FoodType { //enumerated foodtype value, if client wants to specify type of object, coupling still occurs Hamburger, Pizza, HotDog } /// /// Object to be […]

使用委托在C#中实现的观察者模式?

有一个问题已经回答是在C#中,是不是已经使用事件实现的观察者模式? 它询问观察者模式是否已在c#中使用事件实现。 虽然我得到了事件和观察者模式,但不是观察者模式真的只是委托和事件是进一步的实现吗?

我正确使用IRepository吗?

我想在一个小项目中使用IRepository模式(由NHibernate支持,如果重要的话)。 域是一个简单的域,故意让我专注于理解IRepository模式。 单独的域类是Movie ,具有Year , Genre和Title属性。 我的目的是“获取”其属性符合上述类型标准的电影。 惯例似乎是有一个通用的IRepository接口,类似于以下内容: public interface IRepository { T Get(int id); T[] GetAll(); void Add(T item); void Update(T item); void Delete(T item); } 有了基础实现: public abstract class Repository : IRepository { public T Get(int id) { … } public T[] GetAll() { … } public void Add(T item) { … } […]

存储库模式和多个相关的核心实体或业务对象 – 一个存储库或更多?

我正在考虑实现存储库模式(因为我提出的是90%的实现它),并且遇到了一个设计问题 – 我有两个或更多核心业务对象(例如,业务和联系人)一个CRM应用程序),BO可以强烈相关或根本不相关。 在这种情况下,我应该实现一个存储库(例如CrmRepository,.addBusiness(),。addContact()等),还是多个存储库(BusinessRepository,ContactRepository都有自己的.add(),. delete()等等)。 在这种情况下,最佳做法是什么? 底层DAL是EF4。 问候 武

entity framework规范模式实现

如何使用entity framework实现规范模式?