Share via


Microsoft Unity, a lot ResolutionFailedExceptions throwed in vs2015 output, but application runs ok.

Question

Thursday, February 4, 2016 12:37 AM

I'm using ms unity in my asp.net web api 2.2 application.
The Visual studio 2015 output shows a lot ResolutionFailedExceptions:

Exception thrown: 'Microsoft.Practices.Unity.ResolutionFailedException' in Microsoft.Practices.Unity.dll
Exception thrown: 'Microsoft.Practices.Unity.ResolutionFailedException' in Microsoft.Practices.Unity.dll
Exception thrown: 'Microsoft.Practices.Unity.ResolutionFailedException' in Microsoft.Practices.Unity.dll
Exception thrown: 'Microsoft.Practices.Unity.ResolutionFailedException' in Microsoft.Practices.Unity.dll
Exception thrown: 'Microsoft.Practices.Unity.ResolutionFailedException' in Microsoft.Practices.Unity.dll
Exception thrown: 'Microsoft.Practices.Unity.ResolutionFailedException' in Microsoft.Practices.Unity.dll
Exception thrown: 'Microsoft.Practices.Unity.ResolutionFailedException' in Microsoft.Practices.Unity.dll
Exception thrown: 'Microsoft.Practices.Unity.ResolutionFailedException' in Microsoft.Practices.Unity.dll
Exception thrown: 'Microsoft.Practices.Unity.ResolutionFailedException' in Microsoft.Practices.Unity.dll
Exception thrown: 'Microsoft.Practices.Unity.ResolutionFailedException' in Microsoft.Practices.Unity.dll

But the web app runs ok.

Here is my Unity Resolver:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http.Dependencies;
using Microsoft.Practices.Unity;

namespace Bgia.Bootstrap.Web.Tools.DependencyInjection
{
    public class UnityResolver : IDependencyResolver
    {
        protected IUnityContainer Container;

        public UnityResolver(IUnityContainer container)
        {
            if (container == null)
            {
                throw new ArgumentNullException(nameof(container));
            }
            this.Container = container;
        }

        public object GetService(Type serviceType)
        {
            try
            {
                return Container.Resolve(serviceType);
            }
            catch (ResolutionFailedException)
            {
                return null;
            }
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            try
            {
                return Container.ResolveAll(serviceType);
            }
            catch (ResolutionFailedException)
            {
                return new List<object>();
            }
        }

        public IDependencyScope BeginScope()
        {
            var child = Container.CreateChildContainer();
            return new UnityResolver(child);
        }

        public void Dispose()
        {
            Container.Dispose();
        }
    }
}

and here is the configuration code:

            //Dependency Injection
            var container = new UnityContainer();
            //Modules
            RegisterCoreTypes(container);
            RegisterErpTypes(container);
            RegisterSettingsTypes(container);
            RegisterGpTypes(container);
            RegisterPmTypes(container);

            config.DependencyResolver = new UnityResolver(container);

here is another part of the configuration code:

using System.Web.Http;
using Bgia.Erp.Repositories.Maintenance;
using Bgia.Erp.Repositories.UnitOfWorks;
using Microsoft.Practices.Unity;

namespace Bgia.Bootstrap.Web
{
    public static partial class WebApiConfig
    {
        private static void RegisterErpTypes(UnityContainer container)
        {
            container.RegisterType<IErpUnitOfWork, ErpUnitOfWork>(new HierarchicalLifetimeManager());
            container.RegisterType<IMaintenanceProjectRepository, MaintenanceProjectRepository>(new HierarchicalLifetimeManager());
            container.RegisterType<IFaultTagRepository, FaultTagRepository>(new HierarchicalLifetimeManager());
            container.RegisterType<IClientUnitRepository, ClientUnitRepository>(new HierarchicalLifetimeManager());
            container.RegisterType<IFaultHandlingRepository, FaultHandlingRepository>(new HierarchicalLifetimeManager());
        }
    }
}

and here is a web api controller:

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.OData;
using System.Web.Http.OData.Extensions;
using System.Web.Http.OData.Query;
using Bgia.Bootstrap.Web.Tools.ExceptionFilters;
using Bgia.Bootstrap.Web.Tools.Audit;
using Bgia.Gp.Repositories.Info;
using Bgia.Gp.Repositories.UnitOfWorks;
using Bgia.Gp.ViewModels.Info;

namespace Bgia.Bootstrap.Web.Controllers.Gp.Info
{
    [Authorize]
    [RoutePrefix("api/Builder")]
    public class BuilderController : ApiController
    {
        private readonly IGpUnitOfWork _unitOfWork;
        private readonly IBuilderRepository _repository;
        private readonly IAuditTool _auditTool; //记录履历的工具

        public BuilderController(IGpUnitOfWork unitOfWork, IBuilderRepository repository, IAuditTool auditTool)
        {
            _unitOfWork = unitOfWork;
            _repository = repository;
            _auditTool = auditTool;
        }

        //单笔查询 HttpGet: api/Builder/:id
        public async Task<BuilderViewModel> Get(string id)
        {
            return await _repository.FindAsync(id);
        }

        //多笔查询,可以过滤,排序,遵循OData协议,HttpGet: api/Builder
        [EnableQuery(MaxTop = 10000)]
        public IQueryable<BuilderViewModel> Get()
        {
            return _repository.All;
        }

        //除非翻页,否则不要使用这个方法,遵循OData协议, HttpPost: api/Builder/OData
        [Route("Odata")]
        public PageResult<BuilderViewModel> Get(
            ODataQueryOptions<BuilderViewModel> queryOptions)
        {
            var results = queryOptions.ApplyTo(_repository.AllOData.AsQueryable());
            return
                new PageResult<BuilderViewModel>(
                    results as IEnumerable<BuilderViewModel>, Request.ODataProperties().NextLink,
                    Request.ODataProperties().TotalCount);
        }

        //添加 HttpPost: api/Builder
        [MyExceptionFilter]
        public async Task<IHttpActionResult> Post([FromBody] BuilderViewModel vm)
        {
            if (vm == null)
            {
                return BadRequest("外委施工方信息不能为空");
            }
            vm.CreateUser = User.Identity.Name;
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            await _repository.AddAsync(vm);
            await _unitOfWork.SaveAsync();
            vm = _repository.AllLocal.SingleOrDefault(); //返回在内存中唯一的新增完的实体。
            await _auditTool.AuditAsync(vm); //记录Data Audit Log
            return Ok(vm);
        }

        //修改 HttpPut: api/Builder/:id
        [MyExceptionFilter]
        public async Task<IHttpActionResult> Put(string id, [FromBody] BuilderViewModel vm)
        {
            if (vm == null)
            {
                return BadRequest("外委施工方信息不能为空");
            }
            vm.UpdateUser = User.Identity.Name;
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            await _repository.UpdateAsync(vm);
            await _unitOfWork.SaveAsync();
            vm = _repository.AllLocal.SingleOrDefault(); //返回在内存中唯一的修改完的实体。
            await _auditTool.AuditAsync(vm); //记录Data Audit Log
            return Ok();
        }

        //删除 HttpPut: api/Builder/:id
        [MyExceptionFilter]
        public async Task<IHttpActionResult> Delete(string id)
        {
            var vm = await _repository.RemoveAsync(id);
            await _unitOfWork.SaveAsync();
            vm.UpdateUser = User.Identity.Name;
            await _auditTool.AuditAsync(vm); //记录Data Audit Log
            return Ok();
        }

        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
            _unitOfWork.Dispose();
            _auditTool.Dispose();
        }
    }
}

It throws a lot of ResolutionFailedExceptions, but it runs ok.

I don't know what's wrong with my code, or there are some potential errors in my application.

please help! Thank you guys.

All replies (1)

Friday, February 5, 2016 12:20 AM ✅Answered

I use the resolver in this article: http://www.asp.net/web-api/overview/advanced/dependency-injection

Actually the exceptions are throwed in this method: 

        public object GetService(Type serviceType)
        {
            try
            {
                return Container.Resolve(serviceType);
            }
            catch (ResolutionFailedException)
            {
                return null;
            }
        }

Interfaces and Classes like: ModelMetadataProvider, ITraceManager, ITraceWriter, IHttpControllerSelector, IAssembliesResolver, IHttpControllerTypeResolver, IHttpActionSelector, IActionValueBinder, IContentNegotiator, IBodyModelValidator, IHostBufferPolicySelector, IHttpControllerActivator cannot be resolved in my resolver. So are these exceptions bad and need to be fixed?

I don't think the exceptions are need to be fixed.