2011-02-25 118 views
0

任何人都可以指示我如何整合这些工具的所有3 的最新示例?我找到了一些例子,但看起来过时了。 以下是我找到的例子。如何让WCF-StructureMap-NHibernate一起工作?

http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/09/16/integrating-structuremap-and-nhibernate-with-wcf.aspx
http://andreasohlund.net/2009/04/27/unitofwork-in-wcf-using-structuremap/ < - 没有解决的NHibernate
http://blog.coreycoogan.com/2010/05/26/structuremap-wcf-nhibernate-part-1/
http://blog.coreycoogan.com/2010/05/27/structuremap-wcf-nhibernate-part-2/

,我开始尝试coreycoogan例子,但我遇到了一些问题。 他显示了创建StructureMap注册表,其中依赖项被注入到注册表的构造函数中,但他没有显示如何执行 那部分。我从来没有见过StructureMap 注册管理机构的例子。所有我见过的例子都有一个无参数的 contstructor。

这是可能的,如果是这样怎么样?我正在调用Bootstrapper类中的 ObjectFactory.Initialize方法,该方法使用默认约定对 调用扫描程序,并调用 LookForRegistries方法。除了 之外,它会找到所有需要注入依赖关系的注册表类。我会假设,因为我 没有正确接线或不可能。

这里是因为这是在他的岗位 第2部分注册表中的示例代码的一小部分:

/// <summary> 
/// A StructureMap registry for telling the container how to resolve an ISession request. 
/// This must be instantiated and added to the SM configuration so it has an instance of the 
/// SessionFactory to use. 
/// </summary> 
public class WcfNHibernateRegistry : Registry 
{ 
    public WcfNHibernateRegistry(ISessionFactory sessionFactory) 
    { 
     For<NHibernate.ISession>() 
      .Use(() => sessionFactory.GetCurrentSession()); 
    } 
} 
+0

在我看来,您的实际问题无关与WCF或NHibernate的,但更多的线沿线的“如何配置StructureMap当注册表类需要注入依赖” ,否? –

+0

是,否,我想找一个很好的例子来说明如何整合这些技术,所以这个问题真的有两个部分:(1)哪里是一个好例子;(2)在我选择的例子中,我如何解决注册表问题 –

+0

我做了类似的事情,但我没有时间为你创建一个可以回答这个问题的样本,如果你可以把它分解成更具体的问题,我很可能会能够帮助。 –

回答

0

在问候了StructureMap初始化...

的LookForRegistries方法只能找到具有零参数构造函数的注册表类。这是有道理的--StructureMap没有初始化并且可以使用;它没有准备好注入依赖关系。如果你想在你的Registry类中注入一个依赖项,你需要手动完成。 (如果还有其他方法,我不知道它们。)

如果你从这里按照'example 1'http://structuremap.net/structuremap/RegistryDSL.htm#section2你可以这样做,但我相信这个例子假设你将使用生成的Container实例而不是必然是ObjectFactory的静态方法。 (不知道如何使用特定容器中的注册类型。)

或者,您可以删除构造函数参数。我相信这将工作:

public class WcfNHibernateRegistry : Registry 
{ 
    public WcfNHibernateRegistry() 
    { 
     For<ISessionFactory>().Singleton().Use(() => { 
      var cfg = new NHibernate.Cfg.Configuration(); 
      cfg.Configure(); 
      return cfg.BuildSessionFactory(); 
     }); 

     For<ISession>().Use(() => { 
      var fac = ObjectFactory.GetInstance<ISessionFactory>(); 
      return fac.GetCurrentSession(); 
     }); 
    } 
}