我有一个这样的项目结构:

网站->服务->存储库->域对象

我使用Entity Framework 6和Autofac。

有人告诉我应该从我的域对象中删除所有构造逻辑,以便它们尽可能保持POCO状态。 事实是,我具有在创建新对象(例如CreationDate和UserIdCreatedBy)时应初始化的属性

例如,如果我有一个Client对象,我将在Client类构造函数中使用以下逻辑:

public class Client
{
    public Client()
    {
        this.CreationDate = DateTime.UtcNow;
        if (Thread.CurrentPrincipal is CustomPrincipal
            && ((CustomPrincipal)Thread.CurrentPrincipal).CustomIdentity != null
            && ((CustomPrincipal)Thread.CurrentPrincipal).CustomIdentity.User != null)
        {
            this.UserIdCreatedBy = ((CustomPrincipal)Thread.CurrentPrincipal).CustomIdentity.User.UserId;
        }
    }

    ... Properties and such
}

因此,现在,我想将此构造函数逻辑从域对象中移到该对象的工厂中。 如何在调用MyContext.Clients.Create()时优雅地使用它,以便Entity Framework使用它? 那有可能吗? 我知道调用Thread的CurrentPrincipal也不是一件好事,但这是为了说明示例,逻辑可能比普通的默认值更复杂。

非常感谢

#1楼 票数:1 已采纳

假设您使用数据库存储来存储项目(不用于对其进行操作),我认为您可以使用单独的类来实例化对象。 (您描述的某种工厂。)

例如,在我的应用程序中,我经常有UserManager类。 此类根据登录方法(电子邮件+密码,社交ID等)完成与用户创建有关的所有工作。 此外,此类可能包含更改密码等的方法。

UPD:

我将数据层用作了解如何从数据库创建/更新/读取/删除对象的东西。 此外,与db配合使用的类可以具有诸如selectByThis,selectByThat等方法。因此,除了db层之外,您无需在代码中的某些地方编写特定于db的内容。 (我的意思是,您永远不需要编写.Where(a => a.SomeProp == true)之类的东西,您只需为此使用特殊方法,因此,如果您更改数据库,则现在只需更改数据库层即可。整个项目。)

所以是的,当我需要一些特殊的逻辑来初始化对象时,我使用了单独的类。 (就像某种管理器。)该类完成所有工作,然后告诉db层:“嘿,我完成了所有工作,所以请为我保存这个对象!”

它为您简化了维护。 另外,这就是遵循单一责任规则的方法。 一类初始化,做一些工作,另一类保存。

  ask by Dany Latulippe translate from so

未解决问题?本站智能推荐:

2回复

ASP.NET MVC实体框架6导航属性未保存在Edit的SaveChanges()存储库模式中

我遇到一个奇怪的问题,导航属性不存在于页面更新中,而存在于创建中。 我在Entity Framework 6,ASP.NET MVC 5中使用了通用存储库模式。 这是基本代码: 我的情况: 我的存储库实现: 在这里,“获取编辑”页面的基础使用AutoMapper在域
2回复

使用具有实体框架6的存储库模式更新记录

我正在编写一个简单的博客应用程序,并尝试在我的通用存储库模式中建立CRUD操作,但我的更新方法出现错误,该错误说: 'System.Data.Entity.DbSet'不包含'Entry'的定义,并且没有扩展方法'Entry'可以找到接受类型'System.Data.Entity.Db
1回复

ASP.NET MVC5 EF6:给定多重性约束,相应的“ User_AppUser_Target”也必须处于“已删除”状态。 储存库模式

我有一个使用Identity 2和Entity Framework 6和存储库模式的MVC5项目,该项目正在重新开发旧的经典ASP系统。 我从Identity 1开始该项目,此后在v2中,他们介绍了ApplicationUser主键可以是任何东西,而不仅仅是GUID。 但是,我已经将旧项
1回复

无法将类型为“ DBContext.Models.Contact”的对象转换为类型为“ System.Data.Entity.Infrastructure.IObjectContextAdapter”的对象

我试图实现Contact-Controller中的“ Repository-Pattern”和“ Edit”方法正在使用Contact-Repository中的“ Attach Method”引发错误。 在此问题之前,我遇到另一个在代码中找不到ObjectStateManger扩展错误的
2回复

强类型视图(ASP.NET MVC5)中的多个局部视图 无法获取相对路径

我遇到一个问题,保存相对路径后,我无法在列表中获取图片,并且出现错误: CS1061 'IEnumerable<tbl_Advertisement>'不包含'Imagepath'的定义,并且找不到扩展方法'Imagepath'接受类型为'IEnumerable<t
2回复

使用MVC5存储库模式,但需要有关将业务逻辑放在何处的建议

我最新的MVC解决方案由MVC5站点和DAL类库组成,该库将包含每个实体的存储库接口和类。 我正在尝试找出将业务逻辑放置在诸如CheckingAccount.Withdrawl或CheckingAccount.Deposit之类的实体上的位置。 有什么建议么? 当所有存储库类都在我的DAL
2回复

在带有c#,poco和ado.net的存储库中,什么是最好的,整个存储库一个类还是每个实体几个类?

我正在使用c#,poco和旧的ado.net(无ORM)为我的项目创建一个存储库,实际上是它的一个子集。 我有几个实体,我的存储库将通过DAL对那些实体进行CRUD。 我的DAL是IDisposable的,因此我在实例化数据库时设法打开与数据库的连接,并在Dispose方法中关闭该连接。
1回复

使用POCO的Entity Framework存储库从XML列/字符串构建自定义对象时遇到问题

我在存储库模式中使用Entity Framework 4.0填充另一个程序集中的POCO对象。 我的一个对象包含数据库中的XML列(类上的字符串类型)。 不幸的是,此XML字符串包含主键ID,然后我需要使用这些主键ID来检索其他对象(通过存储库)以构建另一个自定义对象。 我一直在尝试使