使用Ninject将userId从WebUI传递到DAL

时间:2016-02-16 13:21:58

标签: asp.net-mvc-3 ninject inversion-of-control

我有一个3层应用程序:WebUI,BLL和DAL。我需要使用Ninject从WebUI层将UserId传递给DAL。组合根位于WebUI层中。 WebUI依赖于BBL,BLL依赖于DAL。

所以问题是如何将userId从WebUI传递到BLL再传递给DAL。当用户通过身份验证时,我需要传递UserId,如果未经过身份验证,则传递null。

在合成根(WebUI)

 private static void RegisterServices(IKernel kernel)
{
            kernel.Bind<ICTOFacade>().To<CTO_Facade>().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)
    {

在DAL中:

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


        #region Helpers

        public GenericRepository(string userId)
        {
            _userId = userId;
        }
...

1 个答案:

答案 0 :(得分:1)

还有其他解决方案,但我会建议你更简单一点,注入这样的复杂类型:

public class UserDTO
{
   public string Id {get; set;}
   ...
}

然后在repo的构造函数中:

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

    public GenericRepository(UserDTO user)
    {
        _currentUser = user;
    }
   ...
}

设置Bind

private static void RegisterServices(IKernel kernel)
{
    ...

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

所以我相信您想要在您的仓库中设置一些默认过滤器或设置默认值,使用此_currentUser.Id您可以获得当前用户的ID。