Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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.