相关疑难解决方法(0)

简单的注入器无法在Web API控制器中注入依赖项

我试图用Simple Injector做一些基本的构造函数DI,似乎它无法解析Web API控制器的依赖关系.

  • 我在"API"文件夹中有一个API控制器,它位于"Controllers"文件夹之外.
  • 我也尝试将它放在"控制器"文件夹中,但这似乎并没有多大区别.我收到的堆栈跟踪与此问题中提供的类似.
  • 我正在使用全新安装的"Simple Injector MVC Integration Quick Start"NuGet Package(v.2.1.0).
  • 我有SimpleInjectorWebApiDependencyResolver文档的基础,这也是在这里找到的.
  • 我正在使用Entity Framework,并查看了有关更改以正确加载上下文的讨论主题.

这似乎不是问题,但我仍然收到以下错误:

类型"MyProject.API.ArticleController"没有默认构造函数

System.ArgumentException at

System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator的System.Web.Http.Internal.TypeActivator.Create [TBase](Type instanceType)中的System.Linq.Expressions.Expression.New(Type type)(HttpRequestMessage请求,类型为controllerType) System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request,HttpControllerDescriptor controllerDescriptor,Type controllerType),Func`1&activator)

如果有人可以提供一些关于是否应该从其当前状态/呼叫顺序修改任何内容的建议,将不胜感激.

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(){ // …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection simple-injector asp.net-web-api

41
推荐指数
1
解决办法
4万
查看次数

完成请求后,如何处置由Unity DI创建的对象?

我想知道是否有更好的方法来处理此问题。

我已经为我们的项目设置了Unity以进行依赖项注入。该项目本身是使用Web API的ASP.NET应用程序。

我安装了以下软件包。

  • 统一
  • Unity.ASPNet.WebAPI

我看不到在获取数据后立即关闭/处置DBContext的选项。

我的控制器

public class NinjasController : ApiController
{
    public Ninja Get(int id)
    {
        INinjaRepository repository = UnityConfig.Container.Resolve(typeof(INinjaRepository), null) as INinjaRepository;
        Ninja ninja = repository.GetNinjaById(id);
        repository.CanBeDisposed = true;
        repository = null;
        UnityConfig.PerRequestLifetimeManager.Dispose();
        return ninja;
    }
}
Run Code Online (Sandbox Code Playgroud)

UnityConfig

public static class UnityConfig
{
    private static Lazy<IUnityContainer> container =
      new Lazy<IUnityContainer>(() =>
      {
          var container = new UnityContainer();
          RegisterTypes(container);
          return container;
      });

    public static IUnityContainer Container => container.Value;
    public static PerRequestLifetimeManager PerRequestLifetimeManager;

    public static void RegisterTypes(IUnityContainer container) …
Run Code Online (Sandbox Code Playgroud)

c# asp.net entity-framework unity-container asp.net-web-api

5
推荐指数
1
解决办法
1555
查看次数

Unity.WebApi | 确保控制器具有无参数的公共构造函数

我在ASP.NET WebApi解决方案中使用Unity.WebApi NuGet包(Unity 4.0.1和Unity.WebApi 5.2.3).我面临的问题是,在尝试运行代码时,我收到错误:Make sure that the controller has a parameterless public constructor.我在这里搜索过类似的帖子,但我找不到任何符合我问题的帖子.

请不要只说"添加无参数构造函数",因为它显示您显然不知道IoC是什么以及为什么该语句完全没有意义并且违背了IoC的目的.我之所以这么说是因为我在迄今为止看过的很多其他主题中看到了这一点.

这是我的Startup.cs(我使用的是Owin,所以我没有Global.asax):

public void Configuration(IAppBuilder app) {
    var config = new HttpConfiguration();
        config.MapHttpAttributeRoutes();

        // Registering unity stuff
        UnityConfig.RegisterComponents();

        app.UseWebApi(config);
}
Run Code Online (Sandbox Code Playgroud)

这是我的UnityConfig.cs:

public static class UnityConfig {
    public static void RegisterComponents() {
        var container = new UnityContainer();
            // Register controller
            container.RegisterType<MyController>();

            // Register interface
            container.RegisterType<IService, Service>();

            GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的API控制器:

public class MyController : ApiController {
    private IService service

    public MyController(IService service) …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection inversion-of-control unity-container asp.net-web-api

4
推荐指数
1
解决办法
2万
查看次数

确保控制器在web api中有一个无参数的公共构造函数?

我正在努力解决使用untiy的依赖注入问题.我已根据此链接实施https://www.asp.net/web-api/overview/advanced/dependency-injection

但得到了这个错误:

{
  "Message": "An error has occurred.",
  "ExceptionMessage": "An error occurred when trying to create a controller of type 'WebAPIController'. Make sure that the controller has a parameterless public constructor.",
  "ExceptionType": "System.InvalidOperationException",
  "StackTrace": "   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n   at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()",
  "InnerException": {
    "Message": "An error has occurred.",
    "ExceptionMessage": "Type 'Fairmoves.Controllers.WebAPIController' does not have a default constructor",
    "ExceptionType": "System.ArgumentException",
    "StackTrace": "   at System.Linq.Expressions.Expression.New(Type type)\r\n   at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc dependency-injection inversion-of-control unity-container asp.net-web-api

1
推荐指数
1
解决办法
6447
查看次数