C# MEF-没有为此对象定义无参数构造函数,等等
我是MEF的新成员,我被困在“没有为这个对象定义无参数构造函数”的地狱里。在过去的几个小时里,我看了很多帖子,我完全被卡住了。我做错了什么?我正在使用。C# MEF-没有为此对象定义无参数构造函数,等等,c#,asp.net-mvc,mef,C#,Asp.net Mvc,Mef,我是MEF的新成员,我被困在“没有为这个对象定义无参数构造函数”的地狱里。在过去的几个小时里,我看了很多帖子,我完全被卡住了。我做错了什么?我正在使用。NET4.5,那么我还需要所有这些属性吗?我是否将旧款MEF与新款混用 更新: 我正在研究的解决方案也参考了Unity 3.3,所以我认为它们可能相互影响。我需要消除团结吗 [Export] [PartCreationPolicy(CreationPolicy.NonShared)] public class HomeCo
NET4.5
,那么我还需要所有这些属性吗?我是否将旧款MEF
与新款混用
更新:
我正在研究的解决方案也参考了Unity 3.3,所以我认为它们可能相互影响。我需要消除团结吗
[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class HomeController : Controller
{
private readonly IHomeService _service;
[ImportingConstructor]
public HomeController(IHomeService service)
{
_service = service;
}
}
[Export(typeof(IHomeService))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class HomeService : IHomeService
{
private readonly IServiceSearch _serviceSearch;
[ImportingConstructor]
public HomeService(IServiceSearch serviceSearch)
{
_serviceSearch = serviceSearch;
}
}
[InheritedExport]
public interface IHomeService
{
// ...
}
[Export(typeof(IServiceSearch))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class ServiceSearch : DataHub.Search, IServiceSearch
{
[ImportingConstructor]
public ServiceSearch(IMapper<xxx, xxxDTO> x)
{
// ...
}
[InheritedExport]
public interface IMapper<TDomain,TDto>
{
TDomain ToDomain(object o);
void Initialize();
TDto DomainToDto(TDomain domain);
}
[Export(typeof(IMapper<Account, AccountDTO>))]
public class AccountMapper : IMapper<Account, AccountDTO>
{
//....
}
protected void Application_OnStart()
{
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var composition = new CompositionContainer(catalog);
IControllerFactory mefControllerFactory = new MefControllerFactory(composition); //Get Factory to be used
ControllerBuilder.Current.SetControllerFactory(mefControllerFactory);
}
public class MefControllerFactory : DefaultControllerFactory
{
private readonly CompositionContainer _container;
public MefControllerFactory(CompositionContainer container)
{
_container = container;
}
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
Lazy<object, object> export = _container.GetExports(controllerType, null, null).FirstOrDefault();
return null == export
? base.GetControllerInstance(requestContext, controllerType)
: (IController)export.Value;
}
public override void ReleaseController(IController controller)
{
((IDisposable)controller).Dispose();
}
}
[导出]
[PartCreationPolicy(CreationPolicy.NonShared)]
公共类HomeController:控制器
{
专用只读IHomeService\u服务;
[导入构造函数]
公共家庭控制器(IHomeService服务)
{
_服务=服务;
}
}
[导出(类型(IHomeService))]
[PartCreationPolicy(CreationPolicy.NonShared)]
公共类家庭服务:IHomeService
{
私有只读服务器搜索服务搜索;
[导入构造函数]
公共家庭服务(iSeries搜索服务搜索)
{
_serviceSearch=serviceSearch;
}
}
[继承导出]
公共接口IHomeService
{
// ...
}
[导出(类型(IServiceSearch))]
[PartCreationPolicy(CreationPolicy.NonShared)]
公共类服务搜索:DataHub.Search,iSeries搜索
{
[导入构造函数]
公共服务搜索(IMapper x)
{
// ...
}
[继承导出]
公共接口映射器
{
TDomain ToDomain(对象o);
void初始化();
TDto域(TDomain域);
}
[导出(类型(IMapper))]
公共类AccountMapper:IMapper
{
//....
}
受保护的无效应用程序\u OnStart()
{
var catalog=新的AssemblyCatalog(Assembly.getExecutionGassembly());
var组合=新组合容器(目录);
IControllerFactory mefControllerFactory=新的mefControllerFactory(组合);//获取要使用的工厂
ControllerBuilder.Current.SetControllerFactory(mefControllerFactory);
}
公共类MefControllerFactory:DefaultControllerFactory
{
私有只读合成容器_容器;
公共MefControllerFactory(合成容器)
{
_容器=容器;
}
受保护的覆盖IController GetControllerInstance(System.Web.Routing.RequestContext RequestContext,类型controllerType)
{
惰性导出=_container.GetExports(controllerType,null,null).FirstOrDefault();
返回null==导出
?base.GetControllerInstance(requestContext,controllerType)
:(IController)export.Value;
}
公共覆盖无效释放控制器(IController控制器)
{
((IDisposable)controller.Dispose();
}
}
我设法使您的代码通过以下修改工作:
ServiceSearch
中的类型移到它之外。我认为MEF不支持嵌套类型。(看起来这只是上面代码示例中的一个输入错误。我认为这不是故意的。)IMapper
中删除InheritedExportAttribute
。无论如何,您在AccountMapper
上有一个显式导出。如果不进行此更改,则会导出两次AccountMapper
。然后导入到ServiceSearch
的构造函数失败,因为MEF不知道哪一个不是要使用的两个匹配导出。或者保留InheritedExportAttribute
并删除显式导出IHomeService
上的InheritedExportAttribute
或HomeService
上的ExportAttribute
我在MEF中没有遇到错误,因为没有为此对象定义无参数构造函数;相反,该错误将说明哪个对象缺少无参数.ctor。确切的错误是什么?哪个类缺少无参数.ctor?查看提供的代码,HomeController和HomeService都没有无参数constructors.@MarkLarter…他们不应该这样做。如果我添加一个,依赖项就不会injected@MetroSmurf...It的HomeController,如果我添加了一个,那么没有任何投诉,但是依赖项没有被注入。您似乎缺少了
IServiceSearch
…我不确定您对#1的意思。对于2和3,我认为[导出]和[继承导入]都是必需的。为什么会出错?InheritedExportAttribute
会自动将导出应用于所有派生类型。ExportAttribute
只导出它所显示的类型。如果同时具有这两个属性,则该类型将被导出两次。关于#1,这可能只是代码中的一个键入错误,但是ServiceSearch
class没有结尾“}”,所以当我将您的代码复制到一个新项目中进行测试时,我认为应该包含以下类型(IMapper
,等等)。我认为您可以忽略#1。