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的实例的工作示例?
您可以在这里使用服务定位器模式。将对象容器(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...
}
}