Asp.net mvc 3 使用Ninject将用户ID从WebUI传递给DAL

Asp.net mvc 3 使用Ninject将用户ID从WebUI传递给DAL,asp.net-mvc-3,ninject,inversion-of-control,Asp.net Mvc 3,Ninject,Inversion Of Control,我有一个三层应用程序:WebUI、BLL和DAL。我需要使用Ninject将用户ID从WebUI层传递给DAL。合成根在WebUI层中。 WebUI依赖于BBL,BLL依赖于DAL 所以问题是如何将用户ID从WebUI传递到BLL,然后再传递到DAL。当用户经过身份验证时,我需要传递UserId,如果没有经过身份验证,则传递null 在合成根目录中(WebUI) 私有静态无效注册服务(IKernel内核) { kernel.Bind().To().InRequestScope(); } 在BL

我有一个三层应用程序:WebUI、BLL和DAL。我需要使用Ninject将用户ID从WebUI层传递给DAL。合成根在WebUI层中。 WebUI依赖于BBL,BLL依赖于DAL

所以问题是如何将用户ID从WebUI传递到BLL,然后再传递到DAL。当用户经过身份验证时,我需要传递UserId,如果没有经过身份验证,则传递null

在合成根目录中(WebUI)

私有静态无效注册服务(IKernel内核)
{
kernel.Bind().To().InRequestScope();
}
在BLL中:

  public class ServiceModule : NinjectModule
    {
        public override void Load()
        {
            Bind(typeof(ISingleEntityRepository<>)).
                To(typeof(GenericRepository<>)).InRequestScope();

            Bind(typeof(IMultipleEntitiesRepository<>)).
                To(typeof(GenericRepository<>)).InRequestScope();
        }
    }

public class CTO_Facade : ICTOFacade
    {
        private ISingleEntityRepository<CargoTransportationOrderModel> _ctoRepoSingle;
        private IMultipleEntitiesRepository<CargoTransportationOrderModel> _ctoRepoMultiple;

    public CTO_Facade(ISingleEntityRepository<CargoTransportationOrderModel> singleRepo,
        IMultipleEntitiesRepository<CargoTransportationOrderModel> multipleRepo)
    {
公共类服务模块:Ninject模块
{
公共覆盖无效负载()
{
绑定(typeof(ISingleEntityRepository))。
To(typeof(GenericRepository)).InRequestScope();
绑定(typeof(imultipletientiesrepository))。
To(typeof(GenericRepository)).InRequestScope();
}
}
公共类CTO_立面:ICTOFacade
{
私有的是单独的存储单元;
私有IMultipleEntityRepository _-actorepomplex;
公共CTO_立面(单体报告单体报告、,
IMultipleEntitysRepository MultiplePO)
{
在达尔:

 public sealed class GenericRepository<T> : ISingleEntityRepository<T>, IMultipleEntitiesRepository<T> where T : BaseModel
    {
        private string _userId;


        #region Helpers

        public GenericRepository(string userId)
        {
            _userId = userId;
        }
...
公共密封类GenericRepository:ISingleEntityRepository,IMultipleEntityRepository,其中T:BaseModel
{
私有字符串_userId;
#地区助手
公共GenericRepository(字符串用户ID)
{
_userId=userId;
}
...

还有其他解决方案,但我将向您推荐一种更简单的方法,即注入一种复杂类型,如下所示:

public class UserDTO
{
   public string Id {get; set;}
   ...
}
然后在回购协议的构造中:

public sealed class GenericRepository<T> : ISingleEntityRepository<T>, IMultipleEntitiesRepository<T> where T : BaseModel
{
    private UserDTO _currentUser;

    public GenericRepository(UserDTO user)
    {
        _currentUser = user;
    }
   ...
}
因此,我相信您希望在回购协议中进行一些默认筛选或设置默认值,使用此
\u currentUser.Id
可以获得当前用户的Id


这与经典ASP无关,请重新标记。
userId
从何处提交?如何访问它?它在什么范围内可用?关于请求周期,从什么时候开始可用?可以通过调用HttpContext.Current.User.Identity.GetUserId()访问userId;WebUI不依赖于数据访问层,因此我不能在DAL中使用WebUI中定义的用户类。
User
类就是一个例子,您可以使用一些DTO来实现这一点,如
UserDTO
CurrentUser
。但是您明白了,对吗?好的,我明白了。但是当用户注销并使用HttpContext时会发生什么。Current==null?那么,y您可以签入repo的
ctor
,并抛出一些
ArgumentException
。此repo可能仅在用户登录时使用
public sealed class GenericRepository<T> : ISingleEntityRepository<T>, IMultipleEntitiesRepository<T> where T : BaseModel
{
    private UserDTO _currentUser;

    public GenericRepository(UserDTO user)
    {
        _currentUser = user;
    }
   ...
}
private static void RegisterServices(IKernel kernel)
{
    ...

    kernel.Bind<UserDTO>().ToMethod(ctx => new UserDTO { Id = HttpContext.Current.User.Identity.GetUserId() }).InRequestScope();
}