Tag: architecture

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

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

基于组件的体系结构:在运行时替换程序集

在运行时替换程序集是个好主意吗? 我可以遇到什么问题? 原始问题: StructureMap – 能够在运行时替换程序集 在Web和非Web应用程序中在运行时替换程序集有什么区别?

如何正确定义Model到ViewModel的关系?

我试图理解Model到ViewModel的关系,并且我一直在遇到同样的问题。 假设我们有一个只有一个字段的“Person”类: public class Person { public string Name; } 在下一阶段,我让我的XAML艺术家创建了一个呈现Person的用户控件,他根据MVVM的实践需要将他的视图与VMPerson(View-Model Person)联系起来,所以现在我添加另一个类: public class VMPerson : INotifyPropertyChange { private Person person; public VMPerson():this(new Person()){} public VMPerson(Person person) { this.person = person; } public Name { get { return person.name; } { set { person.name = value; PropertyChange(“Name”); } } 所以现在我几乎所有的设置..但我的VM类如何与我的模型类中的更改相关? 如果我添加INotifyPropertyChanged并在模型中为“Name”添加一个属性,我将使用与我的ViewModel类非常相似的内容添加一个我不需要的额外层。 有没有办法保持我的Model类不变,并且仍然会在view-model类中通知它内部的更改? 如果没有其他方法比使用INotifyPropertyChanged机制或类似的将在模型中实现的为什么我需要VM? 是否只是为了将一些“模型”类聚合到一个将被提供给View的类中的情况? 我认为我必须在我的理解中遗漏一些东西因为在我看来,根据我所描述的模型来查看模式,而使用View代码隐藏作为控制器将比MVVM更好的抽象,但我当然不确定。 […]

架构问题:使用dependency injection导致垃圾API

我想创建一个类来执行各种与数据库相关的低级操作,但是它提供了一个非常简单的UI层接口。 此类表示特定聚合根中的一组数据,由单个ID int检索。 构造函数有四个参数: public AssetRegister(int caseNumber, ILawbaseAssetRepository lawbaseAssetRepository, IAssetChecklistKctcPartRepository assetChecklistKctcPartRepository, User user) { _caseNumber = caseNumber; _lawbaseAssetRepository = lawbaseAssetRepository; _assetChecklistKctcPartRepository = assetChecklistKctcPartRepository; _user = user; LoadChecklists(); } UI层通过IAssetRegister接口访问此类。 Castle Windsor可以提供ILawbaseAssetRepository和IAssetChecklistKctcPartRepository参数本身,但UI代码需要使用匿名类型提供其他两个: int caseNumber = 1000; User user = GetUserFromPage(); IAssetRegister assetRegister = Moose.Application.WindsorContainer.Resolve(new { caseNumber, user}); 从API设计的角度来看,这是垃圾。 UI层开发人员无法知道IAssetRegister需要整数和用户。 他们需要知道类的实现才能使用它。 我知道我必须在这里遇到某种设计问题。 任何人都可以给我一些指示吗?

应该从服务层返回什么类型的结果?

比方说,我有一个创建post的PostsService : public class PostsService : IPostsService { public bool Create(Post post) { if(!this.Validate(post)) { return false; } try { this.repository.Add(post); this.repository.Save(); } catch(Exception e) { return false; } } } 这样做的问题是,如果在存储库操作期间抛出exception,则会被吞下。 Create()返回false ,消费者知道的所有内容都是没有添加Post ,但不知道原因 。 相反,我想到了一个ServiceResult类: public class ServiceResult { public bool Success { get; private set; } public Exception Exception { get; private […]

架构问题:我应该在哪个组件中放置哪个类,以获得干净的解决方案?

前言: 这是迄今为止我留在这里的最长的post……但我认为在这种情况下需要它。 很长一段时间我对这些事情都有疑问:如何命名程序集,以及如何在其中划分类。 我想在这里给出一个应用程序的例子,只有最少的类来演示我想要理解的内容。 想象一下这个应用程序 接受客户端消息,将它们存储在数据库中,然后将它们出列到MTA服务器。 它是一个Web应用程序,具有用于编写消息的ASP.NET接口+附加附件。 还有一个Silverlight客户端,因此webapp使用一个OperationContract(SaveMessage)公开ClientServices WCF ServiceContract。 还有一个Windows客户端……与Silerlight合同做同样的事情。 好。 这应该是一个虚假的场景来certificate我的无知。 以上将需要以下类: 信息 MessageAddress MessageAddressType(包含From,To的枚举) MessageAddressCollection MessageAttachment MessageAttachmentType MessageAttachmentCollection MessageException MessageAddressFormatException MessageExtensions(Message的静态扩展) MessageAddressExtensions(MessageAddress的静态扩展) MessageAttachmentExtensions(MessageAttachment的静态扩展) Project.Contract.dll 我将上述内容组织到正确的程序集中的第一步就是观察Message,MessageAddress,MessageAttachment,其属性所需的枚举(MessageAddressType,MessageAttachmentType)以及它们所需的集合(MessageAddressCollection,MessageAttachmentCollection)都将被标记为[DataContract]以便它们可以在WCF客户端和服务器之间进行序列化。 两者都很常见,我想我会将它们转移到一个名为Contract的中立共享程序集中。 Project.Client.dll 我需要服务器[ServiceContract]的客户端代理,它会引用Contract.dll中的类。 所以现在服务器,它也引用Project.Contract.dll现在可以保存从WCF客户端收到的序列化消息,并将它们保存到数据库中。 插件 接下来我会意识到我希望通过第三方插件(例如,病毒检查程序)将这些对象处理为服务器端… 但是插件应该只读取(仅)访问变量以检查变量,如果他们看到他们不喜欢的东西就抛出错误。 所以我会考虑回到从IMessageReadOnlyinheritanceMessage …但是在哪里放置那个接口? Project.Interfaces.dll 如果我把它放在一个名为Project.Interfaces.dll的程序集中,这对于可以引用它但没有引用Contracts.dll的插件有效…但是现在客户端必须引用Contracts程序集和接口……听起来不是一个好方向…… 重复对象 或者,我可以有两个Messages结构(并复制其他MessageAttachment等类)…一个用于从客户端到服务器(在Contracts.dll中)进行通信,然后使用第二个ServerMessage / ServerMessageAddress / ServerMessageAddressCollection服务器端,inheritance自IMessageReadOnly,然后看起来我更接近我想要的。 对于重复的对象,插件的访问受限,而Server BL等具有与其工作相关的类型的完全访问权限,而客户端具有不同但相同的对象……实际上……我们应该开始考虑它们由于不相同,我的头脑中更清楚的是对象就在那里与客户交谈,即合同/通信对象)…… 网站用户界面 如果有两个不同的消息,它们现在有不同的属性……哪一个最适合用于支持ASP.NET表单? ServerMessage对象看起来最快(类型之间没有映射)…但是所有逻辑都已经针对客户端消息对象(具有不同的属性和内部逻辑)进行了解决。 那么我是否会使用ClientMessage,并将其映射到Servermessage,以便在不同的介质中保持各种UI逻辑相同? 或者我应该更喜欢映射,只是重写UIvalidation? 那么第三种情况,Silverlight …… Contracts程序集是一个完整框架程序集…… […]

Ninject:是否可以在SingletonScope中使用父对象,在TransientScope中使用子对象?

几个星期以来,我一直在用这种方式绞尽脑汁……我现在拥有的是这样的: 一堆*Service类 所有这些都依赖于通过EF访问数据库的不同*Repository类 为了允许unit testing,将DbContext注入到存储库中。 (所以我不能用于处理上下文) 要正确处理注入的EF上下文,我可以在InRequestScope()或简单的自定义作用域中运行我的依赖树 – InScope(c => new object())和所有其他级别的InParentScope() 。 这两种方法都会在每个请求期间创建和处理大量对象。 另外我们讨论的是单页应用程序,因此95%的查询(大约50个)将在2个请求中执行,因此InRequestScope()似乎不是一个好主意。 此外, *Service类不保持状态,因此可以是InSingletonScope()并且可以最小化对象创建量。 问题 是否有可能在InSingletonScope()拥有parent *Service和*Repository类,并以某种方式将EF DbContext注入到每次访问时将返回一个新实例的范围,并使用NInject来表示IDisposable ? 我知道在创建对象时会注入依赖项,但这仍然可以通过某种方式进行管理吗?

逆变? 协方差? 这个通用架构有什么问题……?

我在设置命令处理架构时遇到了一些问题。 我希望能够创建从ICommand派生的许多不同的命令; 然后,创建从ICommandHandler派生的许多不同的命令处理程序; 这是我开始定义的接口和类: interface ICommand {} class CreateItemCommand : ICommand {} interface ICommandHandler where TCommand : ICommand { void Handle(TCommand command); } class CreateItemCommandHandler : ICommandHandler { public void Handle(CreateItemCommand command) { // Handle the command here } } 我有一个可以创建适当类型的命令的帮助程序类: class CommandResolver { ICommand GetCommand(Message message) { return new CreateItemCommand(); // Handle other commands […]

为什么要使用`new`隐藏方法?

可能重复: C# – 方法签名中的新关键字 假设我有3个class:GrandDad,爸爸,儿子。 儿子inheritance自祖父,inheritance自祖父。 每个类都实现了foo。 // GrandDad class: public virtual void foo() // Dad class: new public virtual void foo() // Son class: public override void foo() 我不明白为什么爸爸会使用新关键字的原因。 据我所知,使用新隐藏方法。 你为什么想做这个? 我阅读了新的MSDN解释,但讨论只是机械的,而不是架构的。 谢谢

您是如何构建面向网络的应用程序的?

我正在开始设计一个主要面向网络的新应用程序,我正在寻找那些提出了良好的架构设计或OOP类模型的人的建议。 请描述基本架构和/或类结构。 你抽出了通信位吗? 你想出了哪些类实体? 该应用程序将同时具有监听器和客户端类。 它类似于feed聚合器,但使用持久连接而不是HTTP。 换句话说,我连接到套接字并具有持久连接,其中数据以双向方式流动。 然后我也有持久连接到我的客户端,我将一些(或全部)数据发送给他们。 此外,我不能使用WCF或.NET 3.0或3.5中的任何东西(虽然我可以使用C#3,因为我正在开发VS2008)。 我必须与Windows 2000兼容。