Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MEF-没有为此对象定义无参数构造函数,等等_C#_Asp.net Mvc_Mef - Fatal编程技术网

C# 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

我是MEF的新成员,我被困在“没有为这个对象定义无参数构造函数”的地狱里。在过去的几个小时里,我看了很多帖子,我完全被卡住了。我做错了什么?我正在使用。
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。