Tag: design patterns

用于避免开启类型的设计模式或接受的解决方案

我正在尝试找到一个好的,干净的设计模式或普遍接受的实现来处理类型的枚举,其中仅在运行时知道单个类型。 我之前已经问过类似的问题,但我仍然不清楚替代实现相比交换机或一系列if-thens有明显的优势。 首先,我将演示一些实现,然后我将问一个问题: 这些实现是否比简单的交换机更好或更优先? 如果是这样,为什么? 如果没有,为什么不呢? 在我的应用程序中,我通过流发送和接收数据。 在运行时,我通过序列化接收数据结构,该结构描述了我的二进制数据中的字段。 这包括字段中的数据类型,即Int32,Bool,Double等。在设计时,我所知道的是数据可能是几种类型中的一种。 我需要从流中读取字段并适当地处理数据。 如果允许启用类型,则解决方案可能如下: 非工作代码: object ReadDataField(byte [] buff, ref int position, Dictionary fields) { object value; int field = buff[position]; position++; switch(fields[field]) { case typeof(Int32): { value = (Int32)BitConverter.ToInt32(buff, position); position += sizeof(Int32); break; } case typeof(Int16): { value = (Int16)BitConverter.ToInt16(buff, position); position += sizeof(Int16); break; } […]

在分离项目时,MVVM会显示来自VM的新窗口

我的问题涉及到创造了一千零一个主题的问题,如果我忽略了我的问题的答案,我很抱歉,但就我看来,没有人真的可以回答我的问题。 例如: 在MVVM WPF中打开新窗口 如果您只使用一个WPF项目(包括模型,虚拟机和视图),那么答案是可以的,但是因为我正在学习如何以正确的方式实现MVVM(我已经多次阅读,最佳实践是创建单独的类lib (dll的)对于模型,viewmodel和一个单独的gui项目)似乎在我眼中不起作用,因为如果我想创建一个像IWindowService这样的接口(在之前的url上描述,也在这里 ,它是不可能访问Window或Control类的因为那时我应该引用gui项目,并且模式的整个目标都会被破坏。 所以我的问题是如何显示一个新的窗口(使用新的viewmodel),例如MainViewModel,同时尊重松散耦合的MVVM原则和单独的项目。 我正在努力实现的更深入的示例: 我有以下结构: MODEL (DLL项目) 轮廓 VIEWMODEL (DLL项目) MainViewModel AddProfileViewModel VIEW(WPF) (exe项目) 主窗口 AddProfileWindow 我打开MainWindow,我想按下AddProfile按钮,然后AddProfileWindow需要显示附加的AddProfileViewModel。

视图模型的MVVMinheritance

我想知道如何在MVVM模式中使用View Models进行inheritance。 在我的应用程序中,我有一个类似于以下内容的数据模型: class CustomObject { public string Title { get; set; } } class CustomItem : CustomObject { public string Description { get; set; } } class CustomProduct : CustomItem { public double Price { get; set; } } 在我的应用程序中,我有一个ViewModelBase类,然后将有以下View Models: CustomObjectViewModel CustomItemViewModel CustomProductViewModel CustomObjectViewModel的粗略实现类似于以下内容: class CustomObjectViewModel : ViewModelBase { private readonly CustomObject _customObject; […]

oo问题 – 混合控制器逻辑和业务逻辑

我不确定我是否使用“标准”术语,但这是我试图解决的基本OO问题。 我正在编写一个Windows窗体。 我不想在表单事件处理程序中使用逻辑,所以我只是从那里调用自定义对象。 在自定义对象中,有两组逻辑。 “控制器”逻辑,决定需要完成什么以及何时完成。 执行需要完成的操作的实际业务逻辑(例如,执行数学运算并返回结果的控件等)。 我的问题是,OO架构是否允许在一个对象中同时使用这两个? 或者是否建议将它们拆分为“控制器”对象和“业务逻辑”对象? 我应该参考这个设计模式吗? 目前,我已经开始将它们组合成一个对象。 该对象具有包含控制器逻辑的“start”方法。 然后,此方法根据需要调用对象的其他方法,并最终将结果返回给对象的调用者。

为DDD中的实体生成标识

编辑 为了进一步澄清我最初的问题,我用更多的’DDD’ – 终点,常见模式和讨论论点重写了这个问题。 可以在修订版本中找到原始版本。 在正确应用DDD时,在域内生成实体 / 聚合根的身份的位置和方式? 我需要在创建或持久化时为我的实体分配唯一标识。 这些身份可以有多种风格 计算(基于实体的特征,因此基于业务要求) 自然的(基于一组规则,因此基于业务逻辑) 代理(基于随机生成的值,没有商业意义) 有许多方法可以生成和分配身份,从使用工厂创建身份,使用ORM授权到基础设施或数据库生成等。但是,如果正确应用DDD,身份应该在何处以及如何生成,考虑到我们不希望贫血领域模型和服务注入实体 ? 要求如上所述 没有贫血领域模型 没有dependency injection服务到实体 可能的方法 工厂 双重调度( 这可以用于身份生成吗? ) 在repositiories内生成 在基础设施内生成(例如ORM或数据库) 注入服务到实体

使用命令和工厂设计模式执行排队作业

我有一个在数据库中排队的作业列表,我需要从数据库中读取并使用线程并行执行它们,我有一个命令类列表来执行每个实现公共接口(命令模式)的作业。 但是当我从数据库中检索挂起的作业时,我需要为每个作业实例化正确的命令对象(在工厂类中) ICommand command; switch (jobCode) { case “A”: command = new CommandA(); break; case “B”: command = new CommandB(); break; case “C”: command = new CommandC(); break; } command.Execute(); 有没有更好的方法来创建正确的命令对象而不使用上面的大开关语句? 或者是否有其他模式来执行排队的作业? 解决方案:这样解决(基于选定的答案)。 这将执行命令对象的延迟实例化。 public class CommandFactory { private readonly IDictionary<string, Func> _commands; public CommandFactory() { _commands = new Dictionary<string, Func> { {“A”, () => […]

如何在C#中自动生成Decorator模式

我有一些接口,以及一个实现此接口的类,说: interface IMyInterface { void Func1(); void Func2(); } class Concrete : IMyInterface { public virtual void Func1() { //do something } public virtual void Func2() { //do something } } 现在,我想创建一个类,用一些特定的逻辑来装饰每个具体的类方法,在非生产环境中,在调用之前和之后执行。 class Decorator : Concrete { public override void Func1() { Pre(); base.Func1; Post(); } public override void Func2() { Pre(); base.Func2; Post(); } […]

在解决方案中获取类库项目中的连接字符串

在我的.net 4解决方案中,我有两个不同的项目 – 一个Web应用程序项目和一个类库项目。 在Web应用程序项目中,数据库连接字符串位于web.config文件中。 我想从类库项目中访问该连接字符串。 可能吗? 如果有,怎么样? 如果有更好的方法来获取连接字符串,请告诉我。

MVVM Light Toolkit – Messenger使用Event Aggregator或Mediator Pattern?

有人可以帮我解决一下,如果来自MVVM light toolkit的 I / Messenger类(和实现)演示了Event Aggregator Pattern或Mediator Pattern的使用吗? 如果某人建议它部分地遵循这两种模式,那么我要求详细说明哪个部分的实现类似于保持答案有效的模式。 参考:两种模式之间的比较 ,这是绝对有趣的。

与嵌套对象的生成器模式

嗨,我遇到了问题。 我想实现构建器模式以使创建对象更容易。 我面临的问题与嵌套对象有关。 我想要创建的对象中有一个其他对象的列表,我真的不知道如何解决它。 我希望能够执行以下操作(例如,更简单的对象): Receipt RestaurantReceipt = new ReceiptBuilder() .withDate(“value”) .withName(“value”) .AddItem(“value”) .WithIngredients(“value”) .WithType(“value”) .AddItem(“value”) .WithIngredients(“value”) .WithType(“value”) .build(); 或类似的东西: Receipt RestaurantReceipt = new ReceiptBuilder() .withDate(“value”) .withName(“value”) .AddItem(“value”, item => { .WithIngredients(“value”) .WithType(“value”) }) .AddItem(“value”, item => { .WithIngredients(“value”) .WithType(“value”) }) .build(); 示例应该代表我的情况,尽管如果有多种类型的嵌套对象。