asp.net-mvc-4 – Autofac和ASP .Net MVC 4 Web API
|
我在ASP .Net MVC 4项目中使用Autofac for IoC. Autofac在初始化存储库并将其传递给API控制器时遇到一些问题. 我确信我的配置中缺少一些东西. 这是我在导航到以下时遇到的错误:https:// localhost:44305 / api / integration <Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'
on type 'EL.Web.Controllers.API.IntegrationController' can be invoked with
the available services and parameters: Cannot resolve parameter
'EL.Web.Infrastructure.IRepository`1[EL.Web.Models.Integration] repository' of
constructor 'Void .ctor(EL.Web.Infrastructure.IRepository`1[EL.Web.Models.Integration])'.
</ExceptionMessage>
<ExceptionType>Autofac.Core.DependencyResolutionException</ExceptionType>
<StackTrace>
at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context,IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.Execute()
at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope,IComponentRegistration registration,IEnumerable`1 parameters)
at Autofac.Core.Resolving.ResolveOperation.ResolveComponent(IComponentRegistration registration,IEnumerable`1 parameters)
at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration,IEnumerable`1 parameters)
at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration,IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context,Service service,IEnumerable`1 parameters,Object& instance)
at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context,IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context,Type serviceType,Type serviceType)
at Autofac.Integration.WebApi.AutofacWebApiDependencyScope.GetService(Type serviceType)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request,Type controllerType,Func`1& activator)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request,HttpControllerDescriptor controllerDescriptor,Type controllerType)
</StackTrace>
</Error>
以下是一些相关的代码: IoC Bootstrapper: public static class Bootstrapper
{
public static void Initialize()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.Register(x => new SharePointContext(HttpContext.Current.Request)).As<ISharePointContext>().SingleInstance();
builder.RegisterType<SharePointRepository<IEntity>>().As<IRepository<IEntity>>();
builder.RegisterType<SharePointContextFilter>().SingleInstance();
builder.RegisterFilterProvider();
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
var resolver = new AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = resolver;
}
}
IRepository: public interface IRepository<T>
{
void Add(T entity);
void Delete(int id);
IEnumerable<T> Find(Expression<Func<T,bool>> filter = null);
void Update(int id,T entity);
}
SharePointRepository: internal class SharePointRepository<T> : IRepository<T> where T : IEntity
{
private readonly ISharePointContext _context;
private readonly string _listName;
internal SharePointRepository(ISharePointContext context)
{
_context = context;
object[] attributes = typeof (T).GetCustomAttributes(typeof (SharePointListAttribute),false);
if (!attributes.Any())
{
throw new Exception("No associated SharePoint list defined for " + typeof (T));
}
_listName = ((SharePointListAttribute) attributes[0]).ListName;
}
public void Add(T entity)
{
throw new NotImplementedException();
}
public void Delete(int id)
{
throw new NotImplementedException();
}
public IEnumerable<T> Find(Expression<Func<T,bool>> filter)
{
throw new NotImplementedException();
}
public void Update(int id,T entity)
{
throw new NotImplementedException();
}
}
IntegrationController: public class IntegrationController : ApiController
{
private readonly IRepository<Integration> _repository;
public IntegrationController(IRepository<Integration> repository)
{
_repository = repository;
}
public void Delete(Guid integrationId)
{
_repository.Delete(Get(integrationId).Id);
}
public IEnumerable<Integration> Get()
{
return _repository.Find();
}
public Integration Get(Guid integrationId)
{
return _repository.Find(i => i.IntegrationId == integrationId).FirstOrDefault();
}
public void Post([FromBody] Integration integration)
{
_repository.Add(integration);
}
public void Put(Guid integrationId,[FromBody] Integration integration)
{
_repository.Update(Get(integrationId).Id,integration);
}
}
IEntity: internal interface IEntity
{
int Id { get; }
}
实体: public abstract class Entity : IEntity
{
protected Entity(int id)
{
Id = id;
}
public int Id { get; private set; }
}
积分: [SharePointList("Integrations")]
public class Integration : Entity
{
public Integration(int id) : base(id)
{
}
public string ApiUrl { get; set; }
public bool DeletionAllowed { get; set; }
public Guid IntegrationId { get; set; }
public string Key { get; set; }
public string List { get; set; }
public bool OutgoingAllowed { get; set; }
public string RemoteWeb { get; set; }
public string Web { get; set; }
}
解决方法您已将IRepository注册错误.随着线:builder.RegisterType<SharePointRepository<IEntity>>().As<IRepository<IEntity>>(); 你告诉Autofac,每当有人要求提供IRepository< IEntity>给他们一个SharePointRepository< IEntity>,但是你要求一个具体的IRepository< Integration>所以你得到一个例外. 你需要的是open generic registration feature of Autofac.所以你的注册更改为: builder.RegisterGeneric(typeof(SharePointRepository<>))
.As(typeof(IRepository<>));
当您要求提供IRepository< Integration>时,它会像您期望的那样工作.它将提供SharePointRepository< Integration>. 您还有另一个不相关的问题:您的SharePointRepository只有一个内部构造函数. 默认情况下,Autofac只查找公共构造函数,因此您可以将构造函数和类更改为public,或者需要告诉Autofac使用FindConstructorsWith方法查找NonPublic构造函数: builder
.RegisterType<SharePointRepository<IEntity>>()
.FindConstructorsWith(
new DefaultConstructorFinder(type =>
type.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)))
.As<IRepository<IEntity>>(); (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何阻止.Net HttpWebRequest.GetResponse()引发异常
- asp.net-mvc – 我应该在ASP.NET MVC3中附加自定义用户上下
- .net – 扩展自定义成员资格提供程序
- asp.net-mvc – .net mvc的简短/快速解释
- 实体框架 – 如何添加外部参考ASP.Net MVC 5身份?
- asp.net – 为什么Web架构松散耦合?
- asp.net – 在IIS7上为WordPress重写URL
- ASP.Net中的会话超时设置
- asp.net-mvc-3 – 在ASP.NET MVC中使用@ data-bind htmlAtt
- 在ASP.NET MVC 6中继续支持Ninject?
- asp.net – 将default.aspx重定向到根虚拟目录
- 如何从ASP.NET应用程序启动/停止Windows服务 –
- ASP.net MVC AntiForgeryToken over AJAX
- 在ASP.NET(C#)中实现安全,独特的“一次性”激活U
- asp.net – JS,图像和CSS被HTTPModule拦截
- asp.net-mvc – asp.net mvc ajax post – redir
- 安装程序 – 在MVC4 RC中缺少单页应用程序模板
- ASP.NET框架中的异步页面 – 其他线程在哪里,如何
- asp.net – 不引用MVC的AllowHtml属性
- 如何删除IIS自定义标头像X-Powered-By:ASP.NET从
