例外情况是:InvalidOperationException – 当前类型,是一个接口,无法构造。 你错过了类型映射吗?

在我的引导程序中:

namespace Conduit.Mam.ClientServices.Common.Initizliaer { public static class Initializer { private static bool isInitialize; private static readonly object LockObj = new object(); private static IUnityContainer defaultContainer = new UnityContainer(); static Initializer() { Initialize(); } public static void Initialize() { if (isInitialize) return; lock (LockObj) { IUnityContainer container = defaultContainer; //registering Unity for MVC DependencyResolver.SetResolver(new UnityDependencyResolver(container)); //registering Unity for web API // GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container); #region managers container.RegisterType(); container.RegisterType(); container.RegisterType(); #endregion if (!isInitialize) { isInitialize = true; } } } } } 

在我的控制器代码中:

 ISettingsManager sm = mUnityContainer.Resolve(); 

将鼠标hover在mUnityContainer上我看到ISettingsManager映射到SettingsManager

但后来我得到了错误:

例外情况是:InvalidOperationException – 当前类型,是一个接口,无法构造。 你错过了类型映射吗?

我也试过了

 ISettingsManager sm = (ISettingsManager)mUnityContainer.Resolve(typeof(ISettingsManager)); 

但没用

您错误地使用了dependency injection。 正确的方法是让你的控制器获取他们需要的依赖关系并留给dependency injection框架注入具体实例:

 public class HomeController: Controller { private readonly ISettingsManager settingsManager; public HomeController(ISettingsManager settingsManager) { this.settingsManager = settingsManager; } public ActionResult Index() { // you could use the this.settingsManager here } } 

正如您在此示例中所看到的,控制器对容器一无所知。 这应该是这样的。

所有DI接线都应该在Bootstraper中进行。 你永远不应该在你的代码中使用container.Resolve<>调用。

就您的错误而言,您在控制器中使用的mUnityContainer可能与您在Bootstraper中构建的实例不同。 但由于您不应该在控制器中使用任何容器代码,因此这应该不再是问题。

只为其他人(像我一样)可能遇到上述错误。 解决方案简单来说。

您可能错过了在代码中注册您的接口和类(实现该接口)注册。

例如,如果错误是
当前类型,xyznamespace.Imyinterfacename,是一个接口,无法构造。你是否缺少类型映射?

然后,您必须在Register方法中注册UnityConfig类中实现Imyinterfacename的类。 使用如下代码

  container.RegisterType(); 

在我的情况下,尽管注册了相关接口的现有实例,但我收到此错误。

原来,这是因为我通过Unity.WebForms Nuget包在WebForms中使用Unity,并且我为我提供实例的依赖项指定了一个Hierarchical Lifetime管理器,但是后续类型的Transient生命周期管理器取决于以前的类型 – 通常不是问题 – 但是使用Unity.WebForms,生命周期管理器的工作方式略有不同……您注入的类型似乎需要一个Hierarchical生命周期管理器,但仍然为每个Web请求创建一个新容器(因为我猜的网页forms的架构,正如在这篇文章中所解释的那样。

无论如何,我通过在注册时没有为类型/实例指定生命周期管理器来解决它。

 container.RegisterInstance(MappingConfig.GetMapper(), new HierarchicalLifetimeManager()); container.RegisterType(new TransientLifetimeManager()); 

 container.RegisterInstance(MappingConfig.GetMapper()); container.RegisterType(); 

这样可以在这里成功解决IMapper:

 public class UserContext : BaseContext, IUserContext { public UserContext(IMapper _mapper) : base(_mapper) { } ... } 

在我的情况下,我使用了2个不同的上下文与Unitofwork和Ioc容器,所以我看到这个问题坚持,而服务层试图向DI注入第二个存储库。 原因是存在模块已经包含其他模块实例和容器应该从没有构建的新存储库中获取调用..我在这里为我的shooes中的人写

可能是您没有注册控制器。 试试以下代码:

步骤1.通过在models文件夹中实现defaultcontrollerfactory来编写自己的控制器工厂类ControllerFactory: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步:在BootStrap中调用它:inBuildUnityContainer方法

 private static IUnityContainer BuildUnityContainer() { var container = new UnityContainer(); // register all your components with the container here // it is NOT necessary to register your controllers // eg container.RegisterType(); //RegisterTypes(container); container = new UnityContainer(); container.RegisterType(); MvcUnityContainer.Container = container; return container; } 

第3步:在全球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)); } 

你完成了

我有这个问题,原因是我没有将Microsoft.Owin.Host.SystemWeb NuGet包添加到我的项目中。 虽然我的启动类中的代码是正确的,但它没有被执行。

因此,如果您正在尝试解决此问题,请在执行Unity注册的代码中添加断点。 如果你没有点击它,你的dependency injection将无法正常工作。

下面的代码对您有所帮助

 public static IUnityContainer Initialise(IUnityContainer container = null) { if (container == null) { container = new UnityContainer(); } 

container.RegisterType(); container.Resolve(); container.RegisterType(new InjectionProperty("_SettingManagerProvider", new ResolvedParameter())); return container; }