如何让WCF-StructureMap-NHibernate协同工作?

时间:2011-02-25 16:46:55

标签: wcf nhibernate structuremap

有人能指出我如何整合所有3的最新例子 这些工具?我找到了一些例子,但它们似乎过时了。 以下是我找到的例子。

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方法。这将查找所有Registry类除外 对于需要注入依赖的那个。我会假设自己 没有正确接线或无法接线。

以下是该注册表的代码示例的一小部分 他的帖子的第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());  
    }  
}  

1 个答案:

答案 0 :(得分:0)

关于StructureMap初始化......

LookForRegistries方法只查找具有零参数构造函数的Registry类。这是有道理的 - StructureMap尚未初始化并且已经可以使用了;它还没有准备好注入依赖项。如果要将依赖项注入Registry类,则需要手动执行。 (如果还有其他方法,我不知道它们。)

如果您按照此处http://structuremap.net/structuremap/RegistryDSL.htm#section2的'示例1'进行操作,您可以这样做,但我相信该示例假设您将使用生成的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();
        });
    }
}