c# - AOP: Custom Model Binder Attribute using Ninject -
in short: trying create custom model binder take in type of user , id, use service class retrieve typed object.
if there better way this, please let me know.
elabaration:
i have ninject setup bindings within domainservice layer, 3 web ui's hooked domain service layer. each asp.net mvc app loads bindings kernal.
//my custom model binder
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; } } my global.aspx.cs
// using ninject override application started protected override void onapplicationstarted() { arearegistration.registerallareas(); // hand on control ninject register controllers registerroutes(routetable.routes); //how instantiate? modelbinders.binders.add(typeof(object), new usermodelbinder(null,entityname.client, user.identity.name)); } my problem iauthentication service, connected other things repository, how instantiate properly? should create new ninjectmodule? confused appreciated. have tried pass in container.get(); - null...
note: reason why creating modelbinder- controllers require type of user service layer requires type of user making request, methods in service layer have overloads 1 thing shopuser or clientuser or other user in system...
edit: easiy within controller call upon iauthenticationservice , type of user , pass domainservice layer process relevant tasks want know how possible modelbindings (and if makes sense way).
edit2: there working sample of using custom attribute aop custom attribute calling/binding/getting instance of isomethingservice?
you can use service locator pattern here. pass ninject container (ikernel?) constructor , resolve authenticationservice each time need bind something.
a refinement of have constructor argument func pass function resolve service. more explicit , removes dependency on ninject. this:
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... } }
Comments
Post a Comment