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

时间:2011-04-11 13:01:37

标签: c# asp.net-mvc-2 .net-3.5 aop ninject

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

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

Elabaration:

我在我的DomainService层中有我所有绑定的ninject设置,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(); - 但它是空的......

注意:我创建模型绑定器的原因 - 所有控制器都需要用户类型,因为我的服务层需要哪种类型的用户发出请求,我服务层中的大多数方法都会有重载的地方ShopUser或ClientUser或系统中任何其他用户的一件事......

修改: 我可以非常轻松地在我的控制器中调用IAuthenticationService并获取用户类型并传入我的域服务层来处理相关任务但我只是想知道如何使用ModelBindings(如果它有意义的话)那样)。

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

1 个答案:

答案 0 :(得分:0)

您可以在此处使用服务定位器模式。将Ninject Container(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...
    }
}