DDD:将IPrincipal注入服务和存储库层

时间:2014-11-06 16:17:24

标签: domain-driven-design inversion-of-control repository-pattern service-layer

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

首先,我的想法是否正确?

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

三,对于Unity,对于从Thread.CurrentPrincipal或HttpContext.Current.User获取Principal,container.RegisterType应该是什么样的?

1 个答案:

答案 0 :(得分: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);
    }
}