接口,不能在 Unity 配置上构建

interface and cannot be constructed on Unity config

我无法在此项目上使用 Unity。

错误是

The current type, Business.Interfaces.IPersonnelBusiness, is an interface and cannot be constructed. Are you missing a type mapping?

我已经将 Unity 更新到最新版本,因为 Whosebug issue我看到 RegisterComponents 已更改为延迟加载 这是全局 asax:

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            // Unity settings
            //UnityConfig.RegisterComponents();

            // For logging
            //SetupSemanticLoggingApplicationBlock();
        }

这是 UnityConfig 文件:

public static class UnityConfig
    {
        #region Unity Container
        private static Lazy<IUnityContainer> container =
          new Lazy<IUnityContainer>(() =>
          {
              var container = new UnityContainer();
              RegisterTypes(container);
              return container;
          });

        /// <summary>
        /// Configured Unity Container.
        /// </summary>
        public static IUnityContainer Container
        {
            get
            {
                return container.Value;
            }
        }
        #endregion

        /// <summary>
        /// Registers the type mappings with the Unity container.
        /// </summary>
        /// <param name="container">The unity container to configure.</param>
        /// <remarks>
        /// There is no need to register concrete types such as controllers or
        /// API controllers (unless you want to change the defaults), as Unity
        /// allows resolving a concrete type even if it was not previously
        /// registered.
        /// </remarks>
        public static void RegisterTypes(IUnityContainer container)
        {
            // NOTE: To load from web.config uncomment the line below.
            // Make sure to add a Unity.Configuration to the using statements.
            // container.LoadConfiguration();

            // TODO: Register your type's mappings here.
            // container.RegisterType<IProductRepository, ProductRepository>();
            container = new UnityContainer();

            // Identity managment
            container.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager());
            container.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager());
            container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager());
            container.RegisterType<AccountController>(new InjectionConstructor());
            container.RegisterType<PersonnelController>(new InjectionConstructor());
            container.RegisterType<UsersAdminController>(new InjectionConstructor());

            // Business Layer
            container.RegisterType<ILogBusiness, LogBusiness>();
            container.RegisterType<IAnomalyBusiness, AnomalyBusiness>();
            container.RegisterType<ICockpitStatBusiness, CockpitStatsBusiness>();
            container.RegisterType<IDocumentBusiness, DocumentBusiness>();
            container.RegisterType<IEmailBusiness, EmailBusiness>();
            container.RegisterType<IMessageBusiness, MessageBusiness>();
            container.RegisterType<INatureBusiness, NatureBusiness>();
            container.RegisterType<IPersonnelBusiness, PersonnelBusiness>();
            container.RegisterType<ISAPBusiness, SAPBusiness>();

            // Set resolver
            DependencyResolver.SetResolver(new UnityDependencyResolver(container));

        }
    }

谢谢大家

编辑:

这里是堆栈和抛出它的代码:

堆栈跟踪:

[ResolutionFailedException: Resolution of the dependency failed, type = 'APPI.WEB.Controllers.HomeController', name = '(none)'.
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The current type, APPI.Business.Interfaces.IPersonnelBusiness, is an interface and cannot be constructed. Are you missing a type mapping?
-----------------------------------------------
At the time of the exception, the container was: 
  Resolving APPI.WEB.Controllers.HomeController,(none)
  Resolving parameter 'personnelRepo' of constructor APPI.WEB.Controllers.HomeController(APPI.Business.Interfaces.IPersonnelBusiness personnelRepo, APPI.Business.Interfaces.IAnomalyBusiness anomalyRepo, APPI.Business.Interfaces.IDocumentBusiness docRepo, APPI.Business.Interfaces.IMessageBusiness msgRepo, APPI.Business.Interfaces.ICockpitStatBusiness cockpitStatRepo, APPI.Business.Interfaces.INatureBusiness natureRepo)
    Resolving APPI.Business.Interfaces.IPersonnelBusiness,(none)
]

控制器:

public class HomeController : BaseController
    {

        private readonly IPersonnelBusiness _IPersonnelBusinessRepo;
        private readonly IAnomalyBusiness _IAnomalyBusinessRepo;
        private readonly IDocumentBusiness _IDocumentBusinessRepo;
        private readonly IMessageBusiness _IMessageBusinessRepo;
        private readonly ICockpitStatBusiness _ICockpitStatBusinessRepo;
        private readonly INatureBusiness _INatureBusinessRepo;

        // Unity inject references
        public HomeController(IPersonnelBusiness personnelRepo, IAnomalyBusiness anomalyRepo, IDocumentBusiness docRepo, 
            IMessageBusiness msgRepo, ICockpitStatBusiness cockpitStatRepo, INatureBusiness natureRepo)
        {
            _IPersonnelBusinessRepo = personnelRepo;
            _IAnomalyBusinessRepo = anomalyRepo;
            _IDocumentBusinessRepo = docRepo;
            _IMessageBusinessRepo = msgRepo;
            _ICockpitStatBusinessRepo = cockpitStatRepo;
            _INatureBusinessRepo = natureRepo;
        }
        public HomeController()
        {

        }

        public ActionResult Index()
        {
            return RedirectToActionPermanent("Cockpit", "Home");
        }

由于

,还有在启动应用程序之前调用的 UnityActivator
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(APPI.WEB.UnityMvcActivator), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethod(typeof(APPI.WEB.UnityMvcActivator), "Shutdown")]

Unity激活器:

public static class UnityMvcActivator
{
    /// <summary>
    /// Integrates Unity when the application starts.
    /// </summary>
    public static void Start() 
    {
        FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
        FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(UnityConfig.Container));

        DependencyResolver.SetResolver(new UnityDependencyResolver(UnityConfig.Container));

        // TODO: Uncomment if you want to use PerRequestLifetimeManager
        // Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
    }

    /// <summary>
    /// Disposes the Unity container when the application is shut down.
    /// </summary>
    public static void Shutdown()
    {
        UnityConfig.Container.Dispose();
    }
}

正如评论中所指出的,问题在于您在初始化程序中实例化了 2 个不同的容器:

    private static Lazy<IUnityContainer> container =
      new Lazy<IUnityContainer>(() =>
      {
          var container = new UnityContainer(); // <-- new container here
          RegisterTypes(container);
          return container;
      });

然后在您的 RegisterTypes 方法中:

    public static void RegisterTypes(IUnityContainer container)
    {
        // NOTE: To load from web.config uncomment the line below.
        // Make sure to add a Unity.Configuration to the using statements.
        // container.LoadConfiguration();

        // TODO: Register your type's mappings here.
        // container.RegisterType<IProductRepository, ProductRepository>();
        container = new UnityContainer(); // <-- new container here

    ...

类型映射在 RegisterTypes 方法中添加到与您作为参数传入的容器不同的实例

为了使其正常工作,您应该删除 RegisterTypes 中容器的实例化,以便它可以使用在参数中传递的实例。

    public static void RegisterTypes(IUnityContainer container)
    {
        // NOTE: To load from web.config uncomment the line below.
        // Make sure to add a Unity.Configuration to the using statements.
        // container.LoadConfiguration();

        // TODO: Register your type's mappings here.
        // container.RegisterType<IProductRepository, ProductRepository>();
        // container = new UnityContainer(); // <-- Remove this

    ...