例外的是:出现InvalidOperationException - 当前类型,是一个接口,并且不能构成。是否缺少类型映射? [英] Exception is: InvalidOperationException - The current type, is an interface and cannot be constructed. Are you missing a type mapping?

查看:4878
本文介绍了例外的是:出现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<ISettingsManager, SettingsManager>();

                container.RegisterType<IMamDataManager, MamDataManager>();

                container.RegisterType<IAppsDataManager, AppsDataManager>();
                #endregion

                if (!isInitialize)
                {
                    isInitialize = true;
                }
            }
        }
    }
}

在我的控制器code:

in my controller's code:

ISettingsManager sm = mUnityContainer.Resolve<ISettingsManager>();

徘徊mUnityContainer我看到 ISettingsManager 映射到设定管理

但后来我得到的错误:

例外是:出现InvalidOperationException - 当前类型,是一种
  接口并且不能构成。是否缺少类型映射?

Exception is: InvalidOperationException - The current type, is an interface and cannot be constructed. Are you missing a type mapping?

我也试过

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

但没有用

推荐答案

正在使用不正确的依赖注入。正确的方法是让你的控制器需要他们所需要的依赖关系,并留给依赖注入框架注入具体实例:

You are incorrectly using Dependency Injection. The proper way is to have your controllers take the dependencies they need and leave to the dependency injection framework inject the concrete instances:

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
    }
}

正如你可以看到在这个例子控制器不知道集装箱什么。这就是应该的。

As you can see in this example the controller doesn't know anything about the container. And that's how it should be.

所有DI线应该在你的Bootstraper发生。你永远不应该使用 container.Resolve&LT;方式&gt; 调用您的code

All the DI wiring should happen in your Bootstraper. You should never use container.Resolve<> calls in your code.

至于你的错误而言,可能是 mUnityContainer 您使用的控制器内部是不一样的实例作为你的Bootstraper构造之一。但是,因为你不应该使用任何容器code在控制器上,这不应该是一个问题了。

As far as your error is concerned, probably the mUnityContainer you are using inside your controller is not the same instance as the one constructed in your Bootstraper. But since you shouldn't be using any container code in your controllers, this shouldn't be a problem anymore.

这篇关于例外的是:出现InvalidOperationException - 当前类型,是一个接口,并且不能构成。是否缺少类型映射?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆