MEF + nHibernate + Fluent NHibernate - 无法转换(ContractName =“NHibernate.ISession”)'来键入'NHibernate.ISession'

时间:2013-09-17 03:03:24

标签: c# nhibernate fluent-nhibernate mef

我已经在这个问题上挣扎了大约两个星期了,并且已经把它切换回一个非常具体的测试。

基本上我有一个会话工厂,它配置NHibernate会话工厂和 具有[Export(typeof(ISession))]的功能。

此课程的代码如下:

    [Export(typeof(SessionFactoryMock))]
[PartCreationPolicy(CreationPolicy.Shared)]
public class SessionFactoryMock
{
    private readonly ISessionFactory sessionFactory;        

    public SessionFactoryMock()
    {
        sessionFactory =
                Fluently.Configure()
                .Database(
                    MsSqlConfiguration.MsSql2008.ConnectionString(c => c
                        .Server(@".\SQLExpress")
                        .Database("Test")
                        .TrustedConnection()))
                .Mappings(configuration => configuration.FluentMappings.Add<TestEntityMap>())
                .ExposeConfiguration(c => new SchemaExport(c).Execute(true, true, false))                    
                .BuildSessionFactory();            
    }

    [Export(typeof(ISession))]
    public ISession GetSession()
    {
        return sessionFactory.OpenSession();
    }
}

我正在使用以下测试:

    [TestMethod]
public void CanGetISession()
{
    Assembly executing = Assembly.GetExecutingAssembly();
    var cat = new AggregateCatalog(new[]
        {
            new AssemblyCatalog(executing)
        });

    var container = new CompositionContainer(cat);

    var batch = new CompositionBatch();
    batch.AddExportedValue(container);

    container.Compose(batch);

    var compositionInfo = new CompositionInfo(cat, container);
    using (var stringWriter = new StringWriter())
    {
        CompositionInfoTextFormatter.Write(compositionInfo, stringWriter);
        string compositionDetail = stringWriter.ToString();
        bool errorDetected = compositionDetail.Contains("[Primary Rejection]");

        if (errorDetected)
        {
            Assert.Fail(compositionDetail);
        }
    }

    var export = container.GetExport<ISession>();
    var exportedValue = export.Value;
    Assert.IsNotNull(exportedValue);
}

此测试将继续失败并显示以下消息:

System.ComponentModel.Composition.CompositionContractMismatchException:无法将类型为'MefnHibernateFail.SessionFactoryMock.GetSession(ContractName =“NHibernate.ISession”)'的基础导出值强制转换为'NHibernate.ISession'。

这是非常无益的。

我正在从代码构建所有Fluent nHibernate和NHibernate库,我有一个示例解决方案。

我真的希望有人可以对此有所了解,因为我现在已经走到了尽头。

完整的源代码可以在这里找到:Source

1 个答案:

答案 0 :(得分:0)

对于其他有同样问题的人。问题是函数的导出应该是[Export(typeof(Func<ISession>)]而不是[Export(typeof(ISession))]。 MEF传递函数指针而不是指向返回对象的指针(这就是我从未调用过函数的原因)。