Tag: design patterns

ORM和图层

对不起,这一点到处都是……但是我觉得自己像是一条追逐我的尾巴的狗,我现在都很困惑。 我正在尝试看到开发3层解决方案(IL,BL,DL)的最简洁方法,其中DL使用ORM来抽象对数据库的访问。 在我看过的每个地方,人们使用LinqToSQL或LLBLGen Pro来生成代表DB Tables的对象,并在所有3个层中引用这些类。 似乎已经忽略了40年的编码模式 – 或者发生了范式转换,我错过了解释部分,为什么它完全可以这样做。 然而,似乎还有一些基础可以让数据存储机制不可知 – 看看LinqToSQL刚刚发生了什么:很多代码都是针对它编写的 – 只有MS才能放弃它…所以我想我尽可能地隔离ORM部分,只是不知道如何。 所以,回到绝对基础,这里是我希望以非常干净的方式组装的基本部分: 我正在开始的程序集:UL.dll BL.dll DL.dll 主要课程: 一个Message类,它具有一个公开MessageAddress对象的集合(称为MessageAddresses)的属性: class Message { public MessageAddress From {get;} public MessageAddresses To {get;} } 每层function: BL向UI公开一个名为GetMessage(Guid id)的UI,它返回一个Message实例。 BL依次包裹DL。 DL有一个ProviderFactory,它包装一个Provider实例。 DL.ProviderFactory公开(可能是我的一部分问题)两个名为GetMessage(Guid id)的静态方法,以及SaveMessage(消息消息)最终目标是能够换出为Linq2SQL编写的提供程序一个用于LLBLGen Pro,或另一个不用于ORM的提供商(例如VistaDB)。 设计目标:我想要分层。 我希望每个图层只依赖于它下面的图层,而不是它上面的图层。 我希望ORM生成的类只在DL层中。 我希望UL与BL共享Message类。 因此,这是否意味着: a)消息在BL中定义b)DB表中的Db / Orm / Manual表示(’DbMessageRecord’,或’MessageEntity’,或其他任何ORM调用它)在DL中定义。 c)BL依赖于DL d)在调用DL方法之前,没有ref或知道BL,BL必须将它们转换为BL实体(例如:DbMessageRecord)? UL: Main() { id […]

MVVM:在ViewModels之间共享数据

如何在多个ViewModel之间共享数据? 例如,在应用程序中有一个名为Project的类。 public class Project : ModelBase { private string _projectName; public string ProjectName { get { return _projectName; } set { _projectName = value; RaisePropertyChanged(() => ProjectName); } } } 在多个ViewModels应用程序中应该访问ActiveProject。 在ViewModels之间共享Project的最佳方法是什么? 调解员模式? (消息) 静态对象 单身模式(如果是的话怎么样?) 我之前使用过Messaging但它需要很多编码。 对于所有ViewModel,我要创建ActiveProject属性,还必须注册一个messenger来更新它。 我使用MVVM Light框架。 任何代码示例将不胜感激。

异步编程设计模式

我正在研究CF.NET的一个小技术框架,我的问题是,我应该如何编写异步部分? 阅读MSDN上的很多内容,但对我来说并不清楚。 所以,这是代码: public class A { public IAsyncResult BeginExecute(AsyncCallback callback) { // What should I put here ? } public void EndExecute() { // What should I put here ? } public void Execute() { Thread.Sleep(1000 * 10); } } 如果有人可以帮助我…… 谢谢 !

在C#中使用带有generics的访问者模式

我想知道以下是否是访客模式的可接受用途。 从Accept()或Visit()调用返回时我感到有点不舒服 – 这是否适合使用此模式,如果没有,为什么不呢? 注意:对于长代码示例的道歉,似乎有必要了解我正在做的事情,因为访问者似乎总是有点参与…… interface IAnimalElement { T Accept(IAnimalVisitor visitor); } interface IAnimalVisitor { T Visit(Lion lion); T Visit(Peacock peacock); T VisitZoo(List animals); } abstract class Animal { public int Age { get; protected set; } } class Lion : Animal, IAnimalElement { public Lion(int age) { Age = age; } public int Accept(IAnimalVisitor […]

串行数据的二进制通信协议解析器设计

我正在重新审视字节流的通信协议解析器设计(串行数据,一次接收1个字节)。 数据包结构(不能更改)是: || Start Delimiter (1 byte) | Message ID (1 byte) | Length (1 byte) | Payload (n bytes) | Checksum (1 byte) || 过去,我已经采用程序状态机方法实现了这样的系统。 当每个数据字节到达时,状态机被驱动以查看输入数据一次/一个字节是否适合有效数据包,并且一旦整个数据包被组装,基于消息ID的switch语句执行适当的消息处理程序。 在一些实现中,解析器/状态机/消息处理程序循环位于其自己的线程中,以便不对串行数据接收的事件处理程序造成负担,并且由指示字节已被读取的信号量触发。 我想知道是否有更优雅的解决方案来解决这个常见问题,利用C#和OO设计的一些更现代的语言function。 任何可以解决这个问题的设计模式? 事件驱动vs polled vs组合? 我很想听听你的想法。 谢谢。 Prembo。

用多态重构或类似替换条件?

我曾尝试过问过这个问题的变体。 我得到了一些有用的答案,但对我来说仍然没有任何感觉。 在我看来,这不应该是一个难以破解的坚果,但我无法找到一个优雅的简单解决方案。 (这是我以前的post,但请首先尝试将此处所述的问题视为程序代码,以免受早期解释的影响,这些解释似乎导致了非常复杂的解决方案: 成本计算器应用程序的设计模式? ) 基本上,问题是为可能包含许多服务的项目创建一个计算器。 在这种情况下“写作”和“分析”。 对于不同的服务,小时数的计算方式不同:写作是通过将“每个产品”小时数乘以产品数来计算的,项目中包含的产品越多,小时费率越低,但总数小时数逐步累积(即对于中型项目,您可以采用小范围定价,然后将中等价格定价加到实际产品数量上)。 然而,分析它更简单,它只是每个尺寸范围的批量率。 你怎么能将它重构成一个优雅的,最好是简单的面向对象的版本(请注意,我绝不会以纯粹的程序方式这样写它,这只是为了以另一种方式简洁地显示问题)。 我一直在考虑工厂,战略和装饰模式,但不能让任何工作得很好。 (我在前一段时间阅读了Head First Design Patterns,所描述的装饰器和工厂模式都与这个问题有一些相似之处,但我很难看到它们是那里所说的好解决方案。装饰器例子似乎非常复杂,只是添加了调味品,但也许它可以在这里工作得更好,我不知道。至少事实上,小时数的计算逐渐积累,让我想到了装饰模式……以及披萨工厂书中的工厂模式示例。好吧,它似乎创造了这样一个荒谬的类爆炸,至少在他们的例子中。我之前已经找到了很好的工厂模式,但我看不出如何在没有得到一套非常复杂的类的情况下使用它) 主要目标是只需要在一个地方(疏松耦合等)进行更改,如果我要添加一个新参数(比如另一个大小,如XSMALL,和/或其他服务,如“管理”)。 这是程序代码示例: public class Conditional { private int _numberOfManuals; private string _serviceType; private const int SMALL = 2; private const int MEDIUM = 8; public int GetHours() { if (_numberOfManuals <= SMALL) { if (_serviceType == "writing") return 30 […]

在MVC应用程序中使用IoC框架有什么用?

我试图理解像StructureMap这样的IoC框架的使用,但我不禁想到这些“设计模式”只是无意义,使代码变得更加复杂。 让我先举一个例子,我认为IoC有点用处。 我认为在处理MVC框架中控制器类的实例化时,IoC可能很有用。 在这种情况下,我正在考虑.NET MVC框架。 通常,控制器类的实例化由框架处理。 这意味着您无法将任何参数传递给控制器​​类的构造函数。 这就是IoC框架可以派上用场的地方。 在IoC容器中的某处,您可以指定在调用控制器类时应该实例化哪个类并将其传递给控制器constructor 。 当您想要对控制器进行unit testing时,这也很方便,因为您可以模拟传递给它的对象。 但就像我说的,我可以理解为什么人们想将它用于控制器类。 但不是在那之外。 从那以后,您可以简单地执行正常的dependency injection 。 但为什么不简单地这样做: public class SomeController { public SomeController() : this( new SomeObj() ) { } publiv SomeController(SomeObj obj) { this.obj = obj; } } 现在您不必使用任何第三方IoC框架,这也意味着更低的学习曲线。 既然您不必深入了解该框架的规范。 您仍然可以在unit testing中模拟对象。 所以也没问题。 你唯一可以说的是,“但现在你的class级与 SomeObj 紧密 SomeObj ”。 这是真的。 但谁在乎!? 这是一个控制器类! 我永远不会重复使用那个类..那么为什么我要担心这种紧耦合……? 我可以模拟传递给它的对象。 […]

使用RavenDB实现存储库和服务模式

我在RavenDB项目中实现存储库和服务模式有些困难。 主要关注的是我的存储库界面应该是什么样子,因为在RavenDB中我使用了几个索引来查询。 假设我需要获取parentid等于1的所有项目。一种方法是使用IQueryable List()并获取所有文档,然后添加一个where子句来选择parentid等于1的项目。这似乎是一个坏主意因为我无法在RavenDB中使用任何索引function。 所以另一种方法是在存储库中有类似这样的东西,IEnumerable Find(字符串索引,Func谓词),但这似乎也是一个坏主意,因为它不够通用,并且要求我实现这个方法,如果我从RavenDB更改到一个常见的SQL服务器。 那么如何实现通用存储库,但仍然可以在RavenDB中获得索引的好处?

什么是解决相互作用的组合爆炸的最佳方法?

我现在正在做的事情之一与游戏有一些相似之处。 为了说明的目的,我将使用一个虚构的,假设的游戏中的一个例子来解释我的问题。 我们称之为DeathBlaster 4:The Deathening 。 在DB4中,您有许多Ship对象,它们在旅行时会定期和随机地遇到Phenomena 。 给定Phenomenon可能对遇到它的Ship具有零个,一个或多个Effects 。 例如,我们可能有四种Ships和三种Phenomena 。 现象 ========================================== 船舶GravityWell BlackHole NebulaField ———— ————————————– —- RedShip + 20%速度-50%功率-50%屏蔽 BlueShip没有影响无懈可击的死亡效果 GreenShip -20%速度死亡+ 50%盾牌现象 YellowShip死亡+ 50%的力量没有效果 此外, Effects可能会相互Effects 。 例如, GravityWell和NebulaField可以在生成的SpeedEffect和ShieldEffect之间获得某种协同作用。 在这种情况下,协同效应本身就是一种Effect – 例如,可能存在由此交互产生的PowerLevelSynergyEffect 。 除了作用于Ship的Effects集之外,不需要任何其他信息来解决最终结果应该是什么。 你可能会开始看到这里出现的问题。 作为一种天真的第一种方法, 要么每Ship都必须知道如何处理每一个Phenomenon ,或者每个Phenomenon都必须知道每Ship 。 这显然是不可接受的,所以我们希望将这些责任转移到其他地方。 显然,这里至少有一个外部课程,可能是某种Mediator或某种Visitor 。 但是最好的方法是什么? 理想的解决方案可能具有以下特性: 就像添加新Phenomenon一样容易添加新Ship 。 不产生影响的交互是默认的,不需要额外的代码来表示。 约定优于配置。 了解Effects如何相互影响,并能够管理这些交互以决定最终结果。 我想,我已经决定了我的方法,但我很想知道最佳设计共识是什么。 […]

dependency injection容器? 它有什么作用?

我一直在阅读DI,这似乎是一个简单的概念。 我没有得到的是容器。 让我们说一下,我想创建自己的容器。 像“detect”这样的动词被使用了,我不知道容器如何“检测”创建了一个新的依赖对象并且知道注入它的依赖项。 对我而言,容器似乎是一个美化的工厂。 任何人都可以解释一个容器是如何实际实现的,或者可能是指向一个资源? 谢谢!