我目前正在使用Unity IOC容器处理基于DDD的应用程序,并且需要一种方法将我的自定义Principal对象传递到允许进行单元测试的存储库和服务层。该怎么做?我目前的想法是在IPrincipal类型的服务和存储库类上创建一个属性。然后在Application_Start上使用Unity来设置和传入Principal。
首先,我的想法是否正确?
两个,如果不是在application_start,这似乎不是正确的地方,因为我需要一个人在注射发生之前先登录,应该在哪里发生?
三,对于Unity,对于从Thread.CurrentPrincipal或HttpContext.Current.User获取Principal,container.RegisterType应该是什么样的?
答案 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);
}
}