【发布时间】:2010-08-03 04:31:19
【问题描述】:
我有一种情况,我在 .Net Web 应用程序中使用 IoC (WindsorContainer),并在 Global.asax 中注册了我的容器,但是在我注册了 WindsorContainer 之后,我还需要在其中实例化另一个类 (Oauth) Global.asax。
但是,因为我在 IIS7 上使用 Sharp 架构和 Nhibernate,所以情况非常棘手,因为 webSessionStorage 在 Global.asax 文件中的 Init() 方法期间注册,并且我必须在 NhibernateSession 之后实例化 OauthInit 类已初始化,但是此时 WindsorContainer 已经为空,因为 Init 发生在 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));
}
}
所以我现在真的处于第 22 个问题中。当我在 Application_Start 请求期间创建 WindsorContainer 时,NHibernateSession 尚未初始化,因此我无法调用 _container.Resolve<IInitOAuthProvider>("initOauth").OAuthProvider 并且当 NHibernateSession 已初始化时,_container对象为空。
任何帮助将不胜感激,谢谢。
【问题讨论】:
-
请发布 CreateWindsorContainer() 的定义
-
另见stackoverflow.com/questions/3353732/…,我在这里看到同样的错误。
标签: .net nhibernate s#arp-architecture