我已经为这个问题苦苦挣扎了大约两个星期,并将其缩减为一项非常具体的测试。
基本上我有一个会话工厂,它配置 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