Tag: n tier

C#和Visual Studio 2005中的程序集之间的循环引用

我正在努力标准化我的所有应用程序的分层/ n层设计的单一方式。 我试图让我的所有应用程序5分层。 码: | UI | | | 业务对象| | | OR-Mapper | | | 数据访问| | | RDBMS | 假设我正在为用户开发具有登录/注销function的应用程序。 我在VS2005解决方案下创建了4个项目。 每个项目都是上层4层中的一个。 我正在设计我的Business Object类,如下所示: – public class User { private string _username; public string Username { get { return _username; } set { _username = value; } } private string _password; public string […]

在N层应用程序中配置自动映射

我有一个N层应用程序,如下所示 MyApp.Model – 包含edmx和数据模型 MyApp.DataAccess – 使用EF的存储库 MyApp.Domain – 域/业务模型 MyApp.Services – 服务(类库) MyApp.Api – ASP.NET Web API 我使用Unity作为我的IoC容器,使用Automapper进行OO映射。 我的DataAccess图层引用了包含所有Data对象的Model层。 我不想在我的Api层中引用我的模型项目。 因此,从服务层返回DomainObjects(业务模型)并映射到API层中的DTO(DTO在API层中)。 我在API层中将domainModel配置为DTO映射,如下所示 public static class MapperConfig { public static void Configure() { Mapper.Initialize( config => { config.CreateMap(); config.CreateMap(); //can’t do this as I do not have reference for State which is in MyApp.Model //config.CreateMap(); […]

在3层架构中使用BAL?如何从DAL调用方法到BAL

我是3层架构的新手,下面是我的DAL代码 public static int Insert(string firstname, string lastname, DateTime dob, string gender,string email, string password) { // bool flag = false; SqlParameter pid; SqlParameter result; SqlConnection con = Generic.DBConnection.OpenConnection(); try { SqlCommand cmd1 = new SqlCommand(“Insertreg”, con); cmd1.CommandType = CommandType.StoredProcedure; cmd1.Parameters.AddWithValue(“@FirstName”, firstname); cmd1.Parameters.AddWithValue(“@LastName”, lastname); cmd1.Parameters.AddWithValue(“@Dob”, dob); cmd1.Parameters.AddWithValue(“@Gender”, gender); cmd1.Parameters.AddWithValue(“@EmailId”, email); cmd1.Parameters.AddWithValue(“@Password”, password); result = cmd1.Parameters.Add(“@result”, […]

使用dapper时在哪里放sql?

我在工作中使用dapper进行mvc3项目,我喜欢它。 但是,在使用dapper时,您应该如何对应用程序进行分层? 目前我只是把我所有的sql直接塞进控制器( slap ),但我正在考虑用静态字符串创建一个类..所以我可以做 var reports = Dapper.Query(conn, MySql.ReportsRunningQuery) 使用dapper时如何存储sql?

关于N层应用的新手的建议

好的人,这是你的另一个: 我是从n层应用程序世界开始的。 我已经对这个主题做了一些阅读,一般建议是n层应用程序的目标是抽象层间的function。 因此,基于此,在n层应用程序中,常规模型是: Data Access -> Business Layer -> Presentation 由于我是.NET开发人员,我认为要增强与多种客户端类型(Silverlight,Web应用程序甚至WinForms客户端)的集成,我应该使用WCF(Windows Communication Foundation)作为业务层的数据服务,以便客户端可以进行通信无论其类型如何。 另外,作为ORM,我是NHibernate的忠实粉丝。 所以我的结构是这样的: Data Access (NHibernate) -> Business Layer (WCF) -> Presentation (WPF, ASP.NET, WinForms 好的,这就是设置。 我是这种方法的新手,所以我想我可以在这里发帖请求有关此设置的建议。 另外,我对如何在VS解决方案中设置它感到困惑,我喜欢在不同的项目中分离层,但是对于数据对象的抽象(如Customer,Order等)呢? 我把em放在一个单独的库中吗? 那么WCF呢? 我知道通过线路将数据类传输到客户端是一个程序员的罪。 专业人士实现这一目标的方式是什么? 谢谢,任何建议将非常感谢。

entity framework6 – 使用我的getHashCode()

有一定的背景可以通过这个 – 请忍受我! 我们有一个使用EF的n层WPF应用程序 – 我们通过dbContext将数据从数据库加载到POCO类中。 销毁dbContext,然后用户就可以编辑数据。 我们使用Julie Lerman在她的书“Programming Entity Framework:DBContext”中建议的“状态绘画”,这样当我们将根实体添加到新的dbContext进行保存时,我们可以设置是否添加,修改或保持每个子实体等等。 。 当我们第一次这样做时(早在2012年11月!)我们遇到的问题是,如果我们添加到dbContext的根实体具有相同子实体的多个实例(即,链接到用户的“任务”记录, “状态历史记录”也链接到同一用户)进程将失败,因为即使子实体是相同的(来自同一数据库行),它们也被赋予不同的哈希码,因此EF将它们识别为不同的对象。 我们修复了这个问题(早在2012年12月!),通过在我们的实体上覆盖GetHashCode,如果实体来自数据库,则返回数据库ID,如果实体尚未保存,则返回唯一的负数。 现在,当我们将根实体添加到dbContext时,它足够聪明,可以实现多次添加相同的子实体并正确处理它。 自2012年12月以来我们一直运作良好,直到上周我们升级到EF6 …… EF6的一个新“function”是它现在使用它自己的Equals和GetHashCode方法来执行更改跟踪任务,忽略任何自定义覆盖。 请参阅: http : //msdn.microsoft.com/en-us/magazine/dn532202.aspx (搜索“减少对编码风格的干扰”)。 如果您希望EF管理变更跟踪,但是在断开连接的n层应用程序中,我们不希望这样做,这很好,实际上这会破坏我们的代码,这些代码已经运行了一年多。 希望这是有道理的。 现在 – 问题 – 有没有人知道我们可以告诉EF6如何在EF5中使用我们的 GetHashCode和Equals方法,或者是否有人有更好的方法来处理将根实体添加到具有重复子实体的dbContext在它,以便EF6会满意吗? 谢谢你的帮助。 对不起,很长的post。 更新已经在EF代码中查看过,看起来像是通过获取实体的哈希码来设置InternalEntityEntry(dbEntityEntry)的哈希码,但是现在在EF6中使用RuntimeHelpers.GetHashCode(_entity)检索,这意味着我们被覆盖实体上的哈希码被忽略。 所以我想让EF6使用我们的哈希码是不可能的,所以我可能需要专注于如何将实体添加到可能具有重复子实体的上下文而不会扰乱EF。 有什么建议? 更新2最烦人的事情是这种function的变化被报告为好事,而不是,正如我所看到的,这是一个突破性的变化! 当然,如果你有断开连接的实体,并且你已经用.AsNoTracking()加载它们以获得性能(并且因为我们知道我们将断开它们,所以为什么还要跟踪它们),那么dbContext没有理由覆盖我们的getHashcode方法! 更新3感谢您的所有意见和建议 – 非常感谢! 经过一些实验后,它似乎与.AsNoTracking()有关。 如果使用.AsNoTracking()加载数据,则重复的子实体是内存中的单独对象(具有不同的哈希码),因此存在状态绘制问题并在以后保存它们。 我们之前通过覆盖哈希码修复了这个问题,因此当实体被添加回保存上下文时,重复的实体被识别为同一个对象并且只添加一次,但我们不能再使用EF6执行此操作。 所以现在我需要进一步研究为什么我们首先使用.AsNoTracking()。 另外一个想法是,EF6的更改跟踪器应该只对其主动跟踪的条目使用自己的哈希码生成方法 – 如果实体已经加载了.AsNoTracking(),它可能应该使用来自底层实体的哈希码吗? 更新4现在我们已经确定我们不能继续在EF6中使用我们的方法(重写的哈希码和.AsNoTracking),我们应该如何管理对断开连接的实体的更新? 我用blogposts / comments / authors创建了这个简单的例子: […]

如何使用MVP将服务层消息/错误传达给更高层?

我目前正在从UI编写ASP.Net应用程序。 我正在实施一个MVP架构,因为我厌倦了Winforms,并希望能够更好地分离关注点。 因此,对于MVP,Presenter处理由View引发的事件。 这是我用来处理用户创建的一些代码: public class CreateMemberPresenter { private ICreateMemberView view; private IMemberTasks tasks; public CreateMemberPresenter(ICreateMemberView view) : this(view, new StubMemberTasks()) { } public CreateMemberPresenter(ICreateMemberView view, IMemberTasks tasks) { this.view = view; this.tasks = tasks; HookupEventHandlersTo(view); } private void HookupEventHandlersTo(ICreateMemberView view) { view.CreateMember += delegate { CreateMember(); }; } private void CreateMember() { if (!view.IsValid) […]

存储库层是否应该返回数据传输对象(DTO)?

我有一个存储库层负责我的数据访问,由服务层调用。 服务层返回序列化并通过线路发送的DTO。 通常,服务只是访问存储库并返回存储库返回的内容。 但为了使其工作,存储库必须返回该DTO的实例。 否则,您首先必须将存储库返回的数据层对象映射到服务层中的DTO并返回该对象。 这看起来很浪费。 最重要的是,如果DTO的创建发生在服务层中,那么在一个存储库调用之前可能已经完成的事情以及因此一个数据库查询现在必须在服务层中的多个存储库调用中发生以“组合”最后的DTO。 当然,除非我在数据和服务层之间创建一个可以包含这样一个组合对象的传输对象。 然后必须将其映射到DTO。 为了纯洁,这似乎是浪费。 但是,让存储库层返回仅通过线路发送的对象也是错误的。