Tag: architecture

dependency injection和开发生产力

抽象 在过去的几个月里,我一直在编写一个轻量级,基于C#的游戏引擎,它具有API抽象和实体/组件/脚本系统。 它的整体想法是通过提供类似于Unity引擎的架构来简化XNA,SlimDX等游戏开发过程。 设计挑战 正如大多数游戏开发者所知,在整个代码中需要访问许多不同的服务 。 许多开发人员使用全局静态实例,例如渲染管理器(或composer php),场景,图形设备(DX),记录器,输入状态,视口,窗口等。 全局静态实例/单例有一些替代方法。 一种是通过构造函数或构造函数/属性dependency injection(DI)为每个类提供它需要访问的类的实例,另一种是使用全局服务定位器,如StructureMap的ObjectFactory,其中服务定位器通常配置为一个IoC容器。 dependency injection 出于多种原因,我选择了DI方式。 最明显的一个是可测试性,通过对接口进行编程并具有通过构造函数提供给它们的每个类的所有依赖关系,这些类很容易测试,因为测试容器可以实例化所需的服务或它们的模拟,并输入到每个class级都要进行测试。 不管你信不信,做DI / IoC的另一个原因是提高代码的可读性。 没有更多的初始化过程实例化所有不同的服务,并通过引用所需服务手动实例化类。 配置内核(NInject)/注册表(StructureMap)可以方便地为引擎/游戏提供单点配置,其中选择和配置服务实现。 我的问题 我常常觉得我正在为接口创建接口 我的工作效率急剧下降,因为我所做的只是担心如何以DI方式做事,而不是快速简单的全局静态方式。 在某些情况下,例如在运行时实例化新实体时,需要访问IoC容器/内核来创建实例。 这会产生对IoC容器本身的依赖(SM中的ObjectFactory,Ninject中的内核实例) ,这实际上与首先使用它的原因背道而驰 。 怎么解决这个问题? 我想到了抽象工厂,但这进一步使代码复杂化。 根据服务要求,某些类的构造函数可能变得非常大,这将使该类在其他上下文中完全无用,如果不使用IoC。 基本上做DI / IoC会大大降低我的工作效率,在某些情况下会进一步使代码和架构复杂化。 因此,我不确定这是一条我应该遵循的道路,还是只是放弃并以老式的方式做事。 我不是在寻找一个单一的答案,说明我应该或不应该做什么,而是讨论从长远来看使用DI是否值得,而不是使用全局静态/单一方式,可能的优点和缺点我忽略了处理DI时,上面列出的问题的可能解决方案。

使用Raven DB的数据访问体系结构

我可以使用哪些数据访问体系结构与Raven DB一起使用? 基本上,我想通过接口分离持久性,所以我不会将下划线存储暴露给上层。 即我不希望我的域看到来自Raven DB的IDocumentStore或IDocumentSession 。 我已经实现了通用存储库模式,这似乎有效。 但是,我不确定这是否是正确的方法。 也许我会去命令查询隔离或其他什么? 你的想法是什么?

分层架构中的entity framework

我正在使用entity framework的分层架构。 这是我到目前为止所提出的(所有项目除了UI都是类库): 实体 :POCO实体。 完全坚持无知。 没有参考其他项目。 由Microsoft的ADO.Net POCO实体生成器生成。 DAL :带有上下文类的EDMX(实体模型)文件。 (t4生成)。 参考文献: Entities BLL :业务逻辑层。 将在此层上实现存储库模式。 参考文献: Entities , DAL 。 这是填充objectcontext的地方: var ctx=new DAL.MyDBEntities(); UI :表示层:ASP.NET网站。 参考: Entities , BLL +配置文件中实体的连接字符串条目(问题#2)。 现在我的三个问题: 我的图层处理方法是否正确? 在我的UI中,我按如下方式访问BLL: var customerRep = new BLL.CustomerRepository(); var Customer = customerRep.GetByID(myCustomerID); 问题是我必须在我的UI的web.config / app.config中定义实体连接字符串,否则我会得到一个运行时exception。 IS定义UI中的实体连接字符串会破坏图层的区别吗? 或者它是否可以在多层分层架构中访问。 我应该采取任何额外的步骤来执行chage跟踪,延迟加载等(通过等我的意思是entity framework在传统的1项目,非POCO代码生成中涵盖的function)? 感谢并为这个冗长的问题道歉。

mef enum出口和建筑

我想用mef制作我的插件子系统,但我有几个问题,因为我是csharp和mef的新手( 我想做的事: 每个插件都可以创建自己的接口IPlugin1,IPlugin2 …… 每个接口都必须具有指定的functionLoad,Unload 使用mef我想枚举所有导出并调用加载/卸载 问题: 一个。 我的解决方案是否良好,如果没有,我如何改进它(通过使用其他东西)? 湾 如何使用mef枚举所有导出并调用指定的接口函数? 我会感谢所有链接和评论家。 谢谢大家。

不了解在系统架构中创建IoC容器的位置

假设我有以下4个.net程序集: Winforms UI 商业逻辑 SQL Server数据访问(实现IRepository) 通用接口(IRepository等的定义) 我的业务逻辑(2)使用构造函数dependency injection通过IRepository(在4中定义)调用数据访问层(3)。 但是,当我停止业务对象时,我需要传入一个实际的存储库。 我通过在业务逻辑层中使用单例类返回实现IRepository的当前使用的具体对象来实现此目的。 我得出的结论是,这是一件坏事,因为我的业务逻辑层现在必须引用3和4。 我想我需要一个IoC容器,但问题是我在哪里创建/放置它似乎无论我在哪里创建它(1-UI)? 还需要保存对3(SQL Server数据访问)的引用。 我不是只是解决问题而不是实现实际的脱钩吗? 我是否在UI中创建IoC容器。 或者通过另一个新组件暴露它。 (我正在使用C#,。net 3.5和AutoFac) 谢谢。

如果您被迫使用Anemic域模型,那么您在哪里放置业务逻辑和计算字段?

我们当前的O / RM工具并不真正允许丰富的域模型,因此我们不得不在各地使用贫血(DTO)实体。 这工作得很好,但我仍然在努力放置基于对象的基本业务逻辑和计算字段。 当前图层: 介绍 服务 知识库 数据/实体 我们的存储库层具有大多数基本的提取/validation/保存逻辑,尽管服务层执行了许多更复杂的validation和保存(因为保存操作也执行日志记录,权限检查等)。 问题是在哪里放置这样的代码: Decimal CalculateTotal(LineItemEntity li) { return li.Quantity * li.Price; } 要么 Decimal CalculateOrderTotal(OrderEntity order) { Decimal orderTotal = 0; foreach (LineItemEntity li in order.LineItems) { orderTotal += CalculateTotal(li); } return orderTotal; } 有什么想法吗?

BLL,DAL,OBJ和3层架构

我的问题是关于3层架构。 我的项目简要类似于下面的内容,但令我恼火的是在我在数据库中插入新列后,我必须更新除BLL之外的所有字段。 在表示层中,我创建了一个OBJ以及DAL内部的DAL,还有一个SQL查询。 我必须手动更新所有这些字段。 如果我以“正常”的方式进行,我将所有这些放在表示层中并在一个地方进行更新。 我是否正确应用这种3层架构,使用这种分层架构有哪些优势? 我的第二个问题是: 在DAL内部,我通过_view收集数据。 我想知道,我应该为每个视图编写另一个BOboj吗?我已经有一个BOboj类但它不包含所有字段。 在插入数据时,我必须使用我的BOboj,但是,当列出数据时,我正在使用视图,在这种情况下,我应该为每个视图或另一个东西创建另一个BOboj_view类吗? 什么是easyies方式呢? 例如; 我有20个视图和40个类映射到sql server上的每个表,我的视图收集数据不同的表(这意味着不同的对象)。我应该再创建20个类,除了代表视图的40个? OBJ class BOboj { private int _PId; private string _Name; ……. ……. } DAL BOboj_DAL { public bool Add(BOboj obj) { using (SqlConnection con = Connect.connect) { string sql = “insert into Persons (Id,Name, ……. ……. } BBL BOboj_BLL { ……. […]

构建一个简单的解释器

我正在开始一个项目,我需要实现一个轻量级的解释器。 解释器用于执行简单的科学算法。 此解释器将使用的编程语言应该很简单,因为它针对的是非软件开发人员(例如,数学家)。 解释器应该支持基本的编程语言function: 实数,变量,多维数组 二进制(+, – ,*,/,%)和布尔(==,!=,, =)操作 循环(for,while),条件表达式(if) function MathWorks MatLab是我前进的一个很好的例子,更简单。 解释器将用作演示算法的环境; 简单的算法,如查找数据集/数组的平均值,或稍微复杂的算法,如高斯消元法或RSA 。 我在这个主题上发现的最佳/最实用的资源是Ron Ayoub在Code Project上的条目( 使用解释器模式解析代数表达式 ) – 这是我问题的缩小版本的完美示例。 紫龙书似乎太多了,更实用了吗? 解释器将使用C#实现为.NET库。 但是,欢迎任何平台的资源,因为这个问题的设计架构部分是最具挑战性的。 任何实用资源? (请避免“这不是微不足道的”或“为什么要重新发明轮子”的回应)

将csv文件/ excel导入sql数据库asp.net

我正在使用c#启动asp.net visual studio 2008 / SQL 2000(将来的2005)项目。 对我来说棘手的部分是现有的数据库模式经常更改,导入文件列都必须与现有的数据库模式匹配,因为它们可能不是列名称上的一对一匹配。 (有一个查找表,它提供了我将使用的列名称的表模式) 我正在探索不同的方法来解决这个问题,并需要一些专家建议。 是否有任何现有的控件或框架可用于执行此操作? 到目前为止,我探索了FileUpload .NET控件,以及一些第三方上传控件来完成上传,如SlickUpload,但上传的文件应<500mb 下一部分是读取我的csv / excel并解析它以显示给用户,以便它们可以与我们的db模式匹配。 我看过CSVReader和其他人,但是因为我需要支持不同的版本,所以更难以实现。 实质上执行此导入的用户将从此导入文件中插入和/或更新多个表。 还有其他更高级的要求,如记录匹配,但预览了导入记录,但我希望首先了解如何执行此操作。 更新:我最终使用csvReader和LumenWorks.Framework上传csv文件。

使用LINQ-to-SQL,这个存储库模式是否有效?

我目前正在阅读Pro Asp.Net MVC Framework一书。 在本书中,作者建议使用类似于以下的存储库模式。 [Table(Name = “Products”)] public class Product { [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)] public int ProductId { get; set; } [Column] public string Name { get; set; } [Column] public string Description { get; set; } [Column] public decimal Price { get; set; } [Column] public string […]