当前类型是一个接口,无法构造。你错过了类型映射吗?

时间:2012-04-19 04:27:24

标签: c# wpf types mapping

我有一个控制器类,它负责双击命令,然后调用一个弹出窗口给用户的方法。类似的东西:

var popup = container.GetService<PopupCommand>();

在上面一行中它会抛出错误说: 当前类型PopupCommand.IPopupDataHandler是一个接口,无法构造。你错过了类型映射吗?

我更新了包含container.GetService()方法的DLL,之前它曾经正常工作。

我尝试在谷歌搜索,但类似的问题与Unity更相关,我怀疑我的问题是否与Unity有关。

2 个答案:

答案 0 :(得分:1)

基本上,编译器会告诉您正在尝试实例化接口。

container.GetService<PopupCommand>()可能会带回一个名为PopupCommand.IPopupDataHandler的接口,您可能需要将其转换为您需要的类型或将类型更改为对象,您还应该检查方法的约束 - 它可能缺少new约束。

答案 1 :(得分:0)

尝试使用Addin DefaultController Factory注册您的控制器。 三步:第1步 1.在项目中添加一个类DefaultControllerFactory

public class ControllerFactory :DefaultControllerFactory
    {
        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            try
            {
                if (controllerType == null)
                    throw new ArgumentNullException("controllerType");

                if (!typeof(IController).IsAssignableFrom(controllerType))
                    throw new ArgumentException(string.Format(
                        "Type requested is not a controller: {0}",
                        controllerType.Name),
                        "controllerType");

                return MvcUnityContainer.Container.Resolve(controllerType) as IController;
            }
            catch
            {
                return null;
            }

        }
        public static class MvcUnityContainer
        {
            public static UnityContainer Container { get; set; }
        }
    }

步骤2:在BuildUnityContainer方法

中的Bootstrap类中注册它
private static IUnityContainer BuildUnityContainer()
    {
      var container = new UnityContainer();

      // register all your components with the container here
      // it is NOT necessary to register your controllers

      // e.g. container.RegisterType<ITestService, TestService>();    
      //RegisterTypes(container);
      container = new UnityContainer();
      container.RegisterType<IProductRepository, ProductRepository>();


      UnityInterceptionExample.Models.ControllerFactory.MvcUnityContainer.Container = container;
      return container;
    }

步骤3:在Global.asax文件中注册

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
            Bootstrapper.Initialise();
            ControllerBuilder.Current.SetControllerFactory(typeof(ControllerFactory));
        } 

并且完成了。 可能这对你有用...... 快乐的编码。