1

我已经为这个问题苦苦挣扎了大约两个星期,并将其缩减为一项非常具体的测试。

基本上我有一个会话工厂,它配置 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

4

1 回答 1

0

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

于 2013-09-23T01:56:45.340 回答