【发布时间】:2013-04-01 05:48:25
【问题描述】:
我正在尝试使用 Simple Injector 做一些基本的构造函数 DI,它似乎无法解析 Web API 控制器的依赖关系。
- 我在“API”文件夹中有一个 API 控制器,它位于“Controllers”文件夹之外。
- 我也尝试将它放在“Controllers”文件夹中,但是 这似乎没有太大的不同。堆栈跟踪 我收到的与this question 中的类似。
- 我正在使用全新安装的“Simple Injector MVC Integration Quick Start”NuGet 包 (v. 2.1.0)。
- 我有来自文档的基础
SimpleInjectorWebApiDependencyResolver,它也与找到的here 相同。 - 我正在使用实体框架,并查看了discussion thread 关于正确加载上下文的更改。
这不 似乎是一个问题,但我仍然收到以下错误:
Type 'MyProject.API.ArticleController' 没有默认值 构造函数
System.ArgumentException 在
System.Linq.Expressions.Expression.New(类型类型)在 System.Web.Http.Internal.TypeActivator.Create[TBase](类型 实例类型)在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage 请求,类型控制器类型,Func`1& 激活器)在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor 控制器描述符,类型 控制器类型)
如果有人能给我一些建议,关于是否应该从当前状态/调用顺序修改任何内容,我们将不胜感激。
ArticleController(基本结构):
public class ArticleController : ApiController
{
private readonly IArticleRepository articleRepository;
private readonly IUserRepository userRepository;
private readonly IReleaseRepository releaseRepository;
public ArticleController(IArticleRepository articleRepository, IUserRepository userRepository, IReleaseRepository releaseRepository)
{
this.articleRepository = articleRepository;
this.userRepository = userRepository;
this.releaseRepository = releaseRepository;
}
// GET api/Article
public IEnumerable<Article> GetArticles(){ // code }
// GET api/Article/5
public Article GetArticle(int id){ // code }
// PUT api/Article/5
public HttpResponseMessage PutArticle(int id, Article article){ // code }
// POST api/Article
public HttpResponseMessage PostArticle(ArticleModel article){ // code }
// DELETE api/Article/5
public HttpResponseMessage DeleteArticle(int id){ // code }
}
SimpleInjectorInitializer:
public static class SimpleInjectorInitializer
{
public static void Initialize()
{
var container = new Container();
InitializeContainer(container);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterMvcAttributeFilterProvider();
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
private static void InitializeContainer(Container container)
{
container.Register<IArticleRepository, ArticleRepository>();
container.Register<IUserRepository, UserRepository>();
container.Register<IReleaseRepository, ReleaseRepository>();
}
}
Global.asax.cs:
public class WebApiApplication : System.Web.HttpApplication
{
private void ConfigureApi()
{
// Create the container as usual.
var container = new Container();
// Verify the container configuration
// container.Verify();
// Register the dependency resolver.
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
ConfigureApi();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
【问题讨论】:
-
您确定
ConfigureApi方法确实在运行吗?你在里面设置断点了吗? -
您为什么要为您的 Web API 配置创建一个单独的
Container实例? -
是的,我确定它已经运行。我在 GlobalConfiguration 上设置 DependencyResolver 的行上设置了一个断点。如果您的意思是在 Global.asax.cs 中,那么我正在关注本指南 (asp.net/web-api/overview/extensibility/…),看看它是否能解决我的问题。但是,它似乎没有。
标签: c# asp.net-web-api dependency-injection simple-injector