J'ai une situation où je l'utilisateur IoC (WindsorContainer) dans une application web .Net, et dans le Global.asax je enregistre mon conteneur, mais tout de suite après que j'inscris mon WindsorContainer I aussi besoin d'instancier une autre classe (Oauth) dans le Global.asax. Cependant, comme j'utilise l'architecture Sharp et Nhibernate sur IIS7, la situation est très délicate car le webSessionStorage est enregistré pendant la méthode Init() dans le fichier Global.asax et je dois instancier la classe OauthInit après la NhibernateSession a été initialisé, cependant, à ce moment-là, le WindsorContainer est déjà nul, puisque l'initialisation se produit après le démarrage de l'application. Voici le code:IoC - WindsorContainer - Asp.Net null après Application_Start
public class Global : HttpApplication, IOAuthServices
{
static ITokenRepository<AccessToken> _accessTokenRepository;
static ITokenRepository<RequestToken> _requestTokenRepository;
private IWindsorContainer _container;
private WebSessionStorage _webSessionStorage;
private IOAuthProvider _provider;
public ITokenRepository<AccessToken> AccessTokenRepository
{
get { return _accessTokenRepository; }
}
public ITokenRepository<RequestToken> RequestTokenRepository
{
get { return _requestTokenRepository; }
}
public IOAuthProvider Provider
{
get { return _provider; }
}
void Application_Start(object sender, EventArgs e)
{
_requestTokenRepository = new InMemoryTokenRepository<RequestToken>();
_accessTokenRepository = new InMemoryTokenRepository<AccessToken>();
CreateWindsorContainer();
}
public override void Init()
{
base.Init();
// The WebSessionStorage must be created during the Init() to tie in HttpApplication events
_webSessionStorage = new WebSessionStorage(this);
}
/// <summary>
/// Due to issues on IIS7, the NHibernate initialization cannot reside in Init() but
/// must only be called once. Consequently, we invoke a thread-safe singleton class to
/// ensure it's only initialized once.
/// </summary>
protected void Application_BeginRequest(object sender, EventArgs e)
{
NHibernateInitializer.Instance().InitializeNHibernateOnce(InitializeNHibernateSession);
_provider = _container.Resolve<IInitOAuthProvider>("initOauth").OAuthProvider); // <-- THIS IS THE ISSUE HERE
}
/// <summary>
/// If you need to communicate to multiple databases, you'd add a line to this method to
/// initialize the other database as well.
/// </summary>
private void InitializeNHibernateSession()
{
NHibernateSession.Init(
_webSessionStorage,
new[] { Server.MapPath("~/bin/MyAppSuite.Data.dll") },
new AutoPersistenceModelGenerator().Generate(),
Server.MapPath("~/NHibernate.config"));
}
private void CreateWindsorContainer()
{
_container = new WindsorContainer();
ComponentRegistrar.AddComponentsTo(_container);
ServiceLocator.SetLocatorProvider(() => new WindsorServiceLocator(_container));
}
}
Je suis vraiment au moment d'une prise 22. Quand je crée mon WindsorContainer lors de la demande Application_Start, le NHibernateSession n'a pas été initialisées, donc je ne peux pas appeler _container.Resolve<IInitOAuthProvider>("initOauth").OAuthProvider
et lorsque le NHibernateSession a été initialisé, l'objet _container est null.
Toute aide serait appréciée, merci.
veuillez publier la définition de CreateWindsorContainer() –
également voir http: // stackoverflow.com/questions/3353732/comment-résoudre-un-user-repository-using-windsor-ioc-au-début-de-la-applicati, je vois la même erreur ici. –