有人可以帮我转换下面的StructureMap吗?
public class NHibernateInstaller : IWindsorInstaller
{
#region IWindsorInstaller Members
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<ISessionFactory>()
.UsingFactoryMethod(k => BuildSessionFactory()));
container.Register(Component.For<NHibernateSessionModule>());
container.Register(Component.For<ISessionFactoryProvider>().AsFactory());
container.Register(Component.For<IEnumerable<ISessionFactory>>()
.UsingFactoryMethod(k => k.ResolveAll<ISessionFactory>()));
HttpContext.Current.Application[SessionFactoryProvider.Key]
= container.Resolve<ISessionFactoryProvider>();
}
#endregion
public ISessionFactory BuildSessionFactory() { ... }
}
到目前为止,我的global.asax:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
IContainer container = new Container(
x =>
{
x.For<ISessionFactory>().Use // ??? NHibernateHelper.BuildSessionFactory();
x.For<IControllerActivator>().Use<StructureMapControllerActivator>();
x.For<IBar>().Use<Bar>();
}
);
DependencyResolver.SetResolver(new StructuredMapDependencyResolver(container));
}
NHibernateHelper.BuildSessionFactory()是我的方法,不知道如何为ISessionFactory设置它。
不知道为什么我需要将NHibernateSessionModule放入我的容器中,我只是在web.config中连接模块,还不够吗?
我不明白其余部分,比如ISessionFactoryProvider如何连接为“.AsFactory()”,你不需要在那里提供实现吗?
resolveAll正在做什么?
我是StructureMap(和一般的DI)的新手,所以请不要认为我非常感谢。
答案 0 :(得分:1)
以下是我用于连接StructureMap和NHibernate的典型设置:
IContainer container = new Container(c =>
{
c.Scan(s=>
{
// This autoregisters the IFoo to Foo
s.AssembliesFromApplicationBaseDirectory();
s.WithDefaultConventions();
};
// SessionFactory needs to be a singleton object
c.ForSingletonOf<ISessionFactory>()
.Use(NHibernateHelper.BuildSessionFactory());
// Add your own interceptor implementation here
c.For<IInterceptor>().Use<EmptyInterceptor>();
// I assume that NHibernateSession uses the NHibernateSessionModule
// I use a similar implementation named TransactionBoundaryModule
c.For<INHibernateSession>()
.HybridHttpOrThreadLocalScoped()
.Use<NHibernateSession>();
// Gets the current session from the NHibernateSession
// Ensures one session per request
c.For<ISession>().Use(x =>
{
var instance = x.GetInstance<INHibernateSession>();
return instance.CurrentSession;
});
// Same for StatelessSession
c.For<IStatelessSession>()
.Use(x => x.GetInstance<ISessionFactory>()
.OpenStatelessSession());
};
仅供参考......我在https://github.com/codeprogression/Fluently-Persistent有参考实施。从CP.FluentlyPersistent.Web / Global.asax.cs开始并按照它完成。我使用StructureMap Registry
类来连接NHibernate,但语法非常相似。
更新(回答关于NHibernateInstaller类中的行的注释/问题):
简短的回答是删除类 - 一旦提供名为SessionFactoryProvider的ISessionFactoryProvider实现,就不需要它。将此行:HttpContext.Current.Application[SessionFactoryProvider.Key] = container.GetInstance<ISessionFactoryProvider>();
添加到您的global.asax.cs。
这就是为什么......在StructureMap中,使用程序集扫描,没有必要注册NHibernateSessionModule。当前的SM二进制文件不包含Windsor具有的类型化工厂实现,但实现在GitHub源中(查找AutoFactory)。要解决此限制,您必须使用GetSessionFactories()方法创建一个名为SessionFactoryProvider的ISessionFactoryProvider派生。