1

我目前正在使用Unity IOC容器开发基于DDD的应用程序,并且需要将我的自定义主体对象传递到允许进行单元测试的存储库和服务层。这应该怎么做?我目前的想法是在IPrincipal类型的服务和存储库类上创建一个属性。然后在Application_Start上使用Unity来设置并传入Principal。DDD:将IPrincipal注入服务和存储库层

其中之一,我在思考的正确轨道上?

二,如果不是在application_start,这似乎是不正确的地方,因为我需要一个人在注射发生之前首先登录,这应该发生在哪里?

三,对于Unity,container.RegisterType看起来应该从Thread.CurrentPrincipal还是HttpContext.Current.User获取主体?

+0

什么是您的业务的主体?看起来你正在用技术术语污染你的域模型,或者你错过了一个有界的上下文。 – plalx 2014-11-17 13:56:06

+0

委托人是指当前登录用户的用户凭证。 – user1790300 2014-11-18 17:57:13

+0

这使得你意识到委托人可能不是一个商业术语,这更多的是一个反问的问题。这个概念应该被翻译成对你的域名有意义的概念。你将与​​校长进行什么样的操作? – plalx 2014-11-18 19:06:43

回答

0

您可以拥有PrincipalDto类,该类将包含需要在服务层中使用的相关IPrincipal属性,并将IPrincipal中的值映射到PrincipalDto。这样您就不需要将IPrincipal的引用程序集包含到其他图层中。

下面是一个使用自动映射的例子。

public class PrincipalDto 
{ 
    public UserId { get; set; } 
    public Username { get; set; } 
    public RoleId { get; set; } 
} 

public class SomeService 
{ 
    public void SomeServiceMethod(PrincipalDto principal) 
    { 
     // do work here 
    } 
} 

public class SomeConsumer() 
{ 
    public void SomeConsumerMethod() 
    { 
     // where User is the IPrincipal object instance 
     var principal = Mapper.Map<PrincipalDto>(User); 

     var service = new Service(); 
     service.SomeServiceMethod(principal); 
    } 
} 
+0

唯一要做的就是我正在尝试在不传递参数的情况下无缝地使服务层和存储库层知道用户。 – user1790300 2014-11-07 15:40:49