asp.net mvc - ApiControllers registration in ASPNET MVC 5 with WebApi and OWIN and SimpleInjector -


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