8

我有一个控制器类负责双击命令,然后调用一个向用户弹出窗口的方法。就像是 :

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

在上面的行中它抛出一个错误说:当前类型,PopupCommand.IPopupDataHandler,是一个接口,不能被构造。您是否缺少类型映射?

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

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

4

2 回答 2

1

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

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

于 2012-04-19T07:30:53.683 回答
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));
        } 

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

于 2016-02-05T14:09:12.657 回答