AOP:使用Ninject自定义模型绑定器属性

本文关键字:绑定 属性 模型 自定义 使用 Ninject AOP | 更新日期: 2023-09-27 17:49:46

简而言之:我正在尝试创建一个自定义模型绑定器,它将接受用户类型并获取其id,然后使用服务类检索强类型对象。

如果有更好的方法,请告诉我。

Elabaration:

我在DomainService层中设置了所有绑定,3个web ui连接到域服务层。每个asp.net mvc应用都会将绑定加载到内核中。

//自定义模型绑定器

public class UserModelBinder : IModelBinder
    {
        private IAuthenticationService auth;
        public UserModelBinder(IAuthenticationService _auth, EntityName type, 
        string loggedonuserid)
        {
            this.auth = _auth;
            CurrentUserType = type;
            CurrentUserId = loggedonuserid;
        }

        public EntityName CurrentUserType { get; private set; }
        private string CurrentUserId {  get; set; }
        public object BindModel(ControllerContext controllerContext, 
        ModelBindingContext bindingContext)
        {
            object loggedonuser = null;
            if (CurrentUserType == EntityName.Client)
                loggedonuser = GetLoggedOnClientUser(CurrentUserId);
            else if (CurrentUserType == EntityName.Shop)
                loggedonuser = GetLoggedOnShopUser(CurrentUserId);
            else
                throw new NotImplementedException();
            return loggedonuser;
        }
        public ClientUser GetLoggedOnClientUser(string loggedonuserid)
        {
            var user = _auth.GetLoggedOnClientUser(loggedonuserid);
            if (user == null)
                throw new NoAccessException();
            return user;
        }
        public ShopUser GetLoggedOnShopUser(string loggedonuserid)
        {
            var user = _auth.GetLoggedOnShopUser(loggedonuserid);
            if (user == null)
                throw new NoAccessException();
            return user;
        }
    }
我Global.aspx.cs

// using NInject to override application started
        protected override void OnApplicationStarted()
        {
            AreaRegistration.RegisterAllAreas();
            // hand over control to NInject to register all controllers
            RegisterRoutes(RouteTable.Routes);

 //how do I instantiate?
            ModelBinders.Binders.Add(typeof(object), new 
            UserModelBinder(null,EntityName.Client, User.Identity.Name));
        }

我的问题是IAuthentication是一个服务,它连接到其他东西,如存储库,我如何实际实例化这个正确?我应该创建一个新的NinjectModule吗?我真的很困惑,所以任何帮助都非常感谢。我已经尝试通过Container.Get();-但它是null…

注意:我创建一个模型绑定器的原因——所有的控制器都需要用户的类型,就像我的服务层需要用户的类型一样,我的服务层中的大多数方法都有重载,它将为ShopUser或ClientUser或系统中的任何其他用户做一件事…

编辑:我可以很容易地在我的控制器中调用IAuthenticationService并获得用户类型并传递到我的domainservice层来处理相关任务,但我只是想知道如何使用ModelBindings(如果这样做有意义的话)。

Edit2:是否有一个使用自定义属性与AOP的自定义属性调用/绑定/获取ISomethingService的实例的工作示例?

AOP:使用Ninject自定义模型绑定器属性

您可以在这里使用服务定位器模式。将对象容器(IKernel?)传递给构造函数,并在每次需要绑定某些东西时解析AuthenticationService。

可以有一个构造函数参数Func,在这里传递函数来解析服务。这将更加显式,并消除对Ninject的依赖。像这样:

public class MyModelBinder : IModelBinder
{
    Func<IAuthenticationService> _resolveAuthService;
    public MyModelBinder(Func<IAuthenticationService> resolveAuthService)
    {
         _resolveAuthService = resolveAuthService;
    }
    public override object Bind(Context c)
    {
        var authService = _resolveAuthService();
        authService.GetSomething();
        // etc...
    }
}