i've project using aspnet mvc5 webapi2, owin , simpleinjector ioc container.
i've read if you're using owin should httpconfiguration, you'll create 1 rather using globalconfiguration.
like in startup class, configuration method:
var config = new httpconfiguration(); config.dependencyresolver = new simpleinjectorwebapidependencyresolver(container);
but receive error need parameterless contructor, , if use:
globalconfiguration.configuration.dependencyresolver = new simpleinjectorwebapidependencyresolver(container);
combined (in simpleinjectorinitializer):
container.registerwebapicontrollers(globalconfiguration.configuration, appdomain.currentdomain.getassemblies());
it works, read on internet:
a common error in owin integration use of globalconfiguration.configuration. in owin create configuration scratch. should not reference globalconfiguration.configuration anywhere when using owin integration.
am doing ok owin , frameworks , technologies being used?
i've tried follow implementation of simpleinjector webapi (there they're using mvc changed little). mvc 5 template (asp.net identity 2.0) combined simple injector
this snippet of startup class now:
public partial class startup { public void configuration(iappbuilder app) { var container = simpleinjectorinitializer.initialize(app); globalconfiguration.configuration.dependencyresolver = new simpleinjectorwebapidependencyresolver(container); configureauth(app, container); } public void configureauth(iappbuilder app, container container) { // added ioc usage: see https://simpleinjector.codeplex.com/discussions/564822 app.use(async (context, next) => { using (container.beginexecutioncontextscope()) { await next(); } }); app.createperowincontext(() => container.getinstance<applicationusermanager>()); // enable application use cookie store information signed in user // , use cookie temporarily store information user logging in third party login provider app.usecookieauthentication(new cookieauthenticationoptions()); app.useexternalsignincookie(defaultauthenticationtypes.externalcookie); // configure application oauth based flow publicclientid = "self"; oauthoptions = new oauthauthorizationserveroptions { tokenendpointpath = new pathstring("/token"), provider = new applicationoauthprovider(publicclientid), authorizeendpointpath = new pathstring("/api/account/externallogin"), accesstokenexpiretimespan = timespan.fromdays(14), // in production mode set allowinsecurehttp = false allowinsecurehttp = true }; // enable application use bearer tokens authenticate users app.useoauthbearertokens(oauthoptions); }
simpleinjectorinitializer class
public static class simpleinjectorinitializer { public static container initialize(iappbuilder app) { var container = getinitializecontainer(app); container.verify(); return container; } public static container getinitializecontainer(iappbuilder app) { var container = new simpleinjector.container(); container.options.defaultscopedlifestyle = new webapirequestlifestyle(); container.registersingleton<iappbuilder>(app); #region webapi registration // ioc asp.net identity container.registerwebapirequest<applicationusermanager>(); container.registerwebapirequest<applicationdbcontext>(() => new applicationdbcontext(configurationmanager.connectionstrings["orgidentityconnectionstring"].connectionstring)); container.registerwebapirequest<iuserstore<applicationuser>>(() => new userstore<applicationuser>(container.getinstance<applicationdbcontext>())); container.registerinitializer<applicationusermanager>(manager => initializeusermanager(manager, app)); // setup isecuredataformat container.registerwebapirequest<isecuredataformat<authenticationticket>, securedataformat<authenticationticket>>(); container.registerwebapirequest<itextencoder, base64urltextencoder>(); container.registerwebapirequest<idataserializer<authenticationticket>, ticketserializer>(); container.registerwebapirequest<idataprotector>(() => new microsoft.owin.security.dataprotection.dpapidataprotectionprovider().create("asp.net identity")); #endregion container.registerwebapirequest<iauthenticationmanager>(() => advancedextensions.isverifying(container) ? new owincontext(new dictionary<string, object>()).authentication : httpcontext.current.getowincontext().authentication); // initialization runs map creation once done when come mapping. // can create map whenever want, slow code down mapping creation involves reflection. mapper.initialize(config => { config.constructservicesusing(container.getinstance); config.addprofile(new webapiautomapperprofile()); config.addglobalignore("errors"); config.addglobalignore("ismodelvalid"); config.addglobalignore("basevalidator"); config.addglobalignore("auditinformation"); }); var profiles = assembly.getexecutingassembly() .gettypes() .where(x => typeof(automapper.profile).isassignablefrom(x)); var config2 = new mapperconfiguration(cfg => { foreach (var profile in profiles) { cfg.addprofile(activator.createinstance(profile) automapper.profile); } }); container.registersingleton<mapperconfiguration>(config2); container.register<imapper>(() => config2.createmapper(container.getinstance)); #region mystuff registrations container.register(typeof(irepository<>), typeof(orgrepository<>), lifestyle.scoped); container.register(typeof(idatabasefactory<>), typeof(databasefactory<>), lifestyle.scoped); var orgcatalogregistration = lifestyle.scoped.createregistration<catalog>(container); container.addregistration(typeof(ipubliccatalog), orgcatalogregistration); container.addregistration(typeof(iprivatecatalog), orgcatalogregistration); #endregion **// todo: common error in owin integration use of globalconfiguration.configuration. in owin create configuration scratch. should not reference globalconfiguration.configuration anywhere when using owin integration.** //is following line ok? container.registerwebapicontrollers(globalconfiguration.configuration, appdomain.currentdomain.getassemblies()); return container; } private static void initializeusermanager(applicationusermanager manager, iappbuilder app) { manager.uservalidator = new uservalidator<applicationuser>(manager) { allowonlyalphanumericusernames = false, requireuniqueemail = true }; //configure validation logic passwords manager.passwordvalidator = new passwordvalidator() { requiredlength = 6, requirenonletterordigit = false, requiredigit = true, requirelowercase = true, requireuppercase = true, }; var dataprotectionprovider = app.getdataprotectionprovider(); if (dataprotectionprovider != null) { manager.usertokenprovider = new dataprotectortokenprovider<applicationuser>( dataprotectionprovider.create("asp.net identity")); } } } }
if take @ same page got quote from, you'll see have register web api configuration owin's iappbuilder
follows:
app.usewebapi(config);
Comments
Post a Comment