[英]In a repository pattern, how can I integrate domain object factories
我有一个这样的项目结构:
网站->服务->存储库->域对象
我使用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也不是一件好事,但这是为了说明示例,逻辑可能比普通的默认值更复杂。
非常感谢
假设您使用数据库存储来存储项目(不用于对其进行操作),我认为您可以使用单独的类来实例化对象。 (您描述的某种工厂。)
例如,在我的应用程序中,我经常有UserManager类。 此类根据登录方法(电子邮件+密码,社交ID等)完成与用户创建有关的所有工作。 此外,此类可能包含更改密码等的方法。
UPD:
我将数据层用作了解如何从数据库创建/更新/读取/删除对象的东西。 此外,与db配合使用的类可以具有诸如selectByThis,selectByThat等方法。因此,除了db层之外,您无需在代码中的某些地方编写特定于db的内容。 (我的意思是,您永远不需要编写.Where(a => a.SomeProp == true)之类的东西,您只需为此使用特殊方法,因此,如果您更改数据库,则现在只需更改数据库层即可。整个项目。)
所以是的,当我需要一些特殊的逻辑来初始化对象时,我使用了单独的类。 (就像某种管理器。)该类完成所有工作,然后告诉db层:“嘿,我完成了所有工作,所以请为我保存这个对象!”
它为您简化了维护。 另外,这就是遵循单一责任规则的方法。 一类初始化,做一些工作,另一类保存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.