1

私はこの問題に約 2 週間取り組んできましたが、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 ライブラリを構築しており、サンプル ソリューションがあります。

私は今、ほとんど行き詰まっているので、誰かがこれに光を当てることができることを本当に望んでいます.

完全なソース コードはここにあります:ソース

4

1 に答える 1

0

同じ問題を抱えている他の人のために。問題は、関数のエクスポートが .xml であってはならないこと[Export(typeof(Func<ISession>)]でし[Export(typeof(ISession))]た。MEF は、返されたオブジェクトへのポインターではなく、関数ポインターを渡します (これが、関数が呼び出されなかった理由です)。

于 2013-09-23T01:56:45.340 に答える