Я пытаюсь создать базовый конструктор DI с помощью Simple Injector, и мне кажется, что он не может разрешить зависимости для контроллеров веб-API.
- У меня есть контроллер API в папке «API», которая находится за пределами папки «Контроллеры».
- Я также попытался поместить его в папку «Контроллеры», но это, похоже, не имело большого значения. Полученная мной трассировка стека аналогична той, которая представлена в этот вопрос.
- Я использую новую установку пакета NuGet "Simple Injector MVC Integration Quick Start" (v. 2.1.0).
- У меня есть база
SimpleInjectorWebApiDependencyResolver
из документации, которая также совпадает с найденной здесь. - Я использую Entity Framework и просмотрел ветку обсуждения об изменениях для правильной загрузки контекста.
Кажется, это не проблема, но я все равно получаю следующую ошибку:
Тип MyProject.API.ArticleController не имеет конструктора по умолчанию.
System.ArgumentException в
System.Linq.Expressions.Expression.New (Тип типа) в System.Web.Http.Internal.TypeActivator.Create [TBase] (Тип instanceType) в System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivatorMessageType request, TypeReportMessage controller , Func`1 и активатор) в System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (запрос HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, тип controllerType)
Был бы признателен, если бы кто-нибудь мог предложить мне несколько предложений о том, следует ли что-либо изменить из его текущего состояния / порядка вызовов.
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
метод действительно запущен? Вы установили в нем точку останова? - person Steven   schedule 09.04.2013Container
экземпляр для конфигурации веб-API? - person Steven   schedule 09.04.2013