我已经在这个问题上挣扎了大约两个星期了,并且已经把它切换回一个非常具体的测试。
基本上我有一个会话工厂,它配置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
答案 0 :(得分:0)
对于其他有同样问题的人。问题是函数的导出应该是[Export(typeof(Func<ISession>)]
而不是[Export(typeof(ISession))]
。 MEF传递函数指针而不是指向返回对象的指针(这就是我从未调用过函数的原因)。