标签: ninject

主要的C#DI/IoC框架如何比较?

冒着进入神圣战争领域的风险,这些流行的DI/IoC框架有哪些优点和缺点,可以轻松地被认为是最好的?..:

  • Ninject
  • 统一
  • Castle.Windsor
  • Autofac
  • StructureMap

我还没有列出其他用于C#的DI/IoC框架吗?

在我的用例的上下文中,我正在构建一个客户端WPF应用程序,一个WCF/SQL服务基础架构,易用性(特别是在清晰简洁的语法方面),一致的文档,良好的社区支持和性能都是重要因素在我的选择.

更新:

所引用的资源和重复问题似乎已经过时,那些了解所有这些框架的人能否提出并提供一些真正的见解?

我意识到关于这个主题的大多数意见可能都有偏见,但我希望有人花时间研究所有这些框架,并且至少进行了一般性的客观比较.

如果以前没有这样做,我非常愿意自己进行调查,但我认为至少有一些人已经这样做了.

第二次更新:

如果您有多个DI/IoC容器的使用经验,请对这些容器的优缺点进行排序和总结,谢谢.这不是发现人们制作的所有模糊小容器的练习,我正在寻找流行(和主动)框架之间的比较.

c# dependency-injection ninject ioc-container unity-container

298
推荐指数
7
解决办法
10万
查看次数

针对DI的Ninject vs Unity

我们正在使用ASP.net MVC.

哪个是最好的DI框架Ninject或Unity?为什么?

asp.net-mvc ninject unity-container

100
推荐指数
5
解决办法
5万
查看次数

Ninject + MVC3 = InvalidOperationException:Sequence不包含任何元素

我创建了一个新的MVC3项目,点击F5,看到了示例页面.

然后我使用NuGet获得Ninject.MVC扩展.我根据Ninject文档,如何设置MVC3应用程序修改了我的global.asax :

public class MvcApplication : NinjectHttpApplication
{
   public static void RegisterGlobalFilters(GlobalFilterCollection filters)
   {
       filters.Add(new HandleErrorAttribute());
   }

   public static void RegisterRoutes(RouteCollection routes)
   {
       routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

       routes.MapRoute(
           "Default", // Route name
           "{controller}/{action}/{id}", // URL with parameters
           new { controller = "Home", action = "Index", 
               id = UrlParameter.Optional });
   }

   protected override IKernel CreateKernel()
   {
       var kernel = new StandardKernel();
       kernel.Load(Assembly.GetExecutingAssembly());
       return kernel;
   }

   protected override void OnApplicationStarted()
   {
       base.OnApplicationStarted();

       AreaRegistration.RegisterAllAreas();
       RegisterGlobalFilters(GlobalFilters.Filters);
       RegisterRoutes(RouteTable.Routes);
   }
}
Run Code Online (Sandbox Code Playgroud)

现在当我运行应用程序时,我得到了死亡的黄色屏幕,但有以下异常:

InvalidOperationException - …

ninject asp.net-mvc-3

89
推荐指数
3
解决办法
2万
查看次数

如何在asp.net Web窗体上实现Ninject或DI?

有很多例子可以让它在MVC应用程序上运行.它是如何在Web窗体上完成的?

asp.net webforms ninject

80
推荐指数
5
解决办法
3万
查看次数

MVC5,Web API 2和Ninject

我用Web API 2创建了一个新的MVC5项目,然后我从NuGet添加了Ninject.MVC3包.

构造函数注入适用于MVC5控制器,但在尝试将其与Web API控制器一起使用时出现错误.

尝试创建"UserProfileController"类型的控制器时发生错误.确保控制器具有无参数的公共构造函数.

工作MVC5控制器的构造函数:

public class HomeController : Controller
{
    private IMailService _mail;
    private IRepository _repo;

    public HomeController(IMailService mail, IRepository repo)
    {
        _mail = mail;
        _repo = repo;
    }
}
Run Code Online (Sandbox Code Playgroud)

非工作Web API控制器的构造函数:

public class UserProfileController : ApiController
{
    private IRepository _repo;

    public UserProfileController(IRepository repo)
    {
        _repo = repo;
    }
}
Run Code Online (Sandbox Code Playgroud)

下面是完整的NinjectWebCommon.cs文件:

[assembly: WebActivator.PreApplicationStartMethod(typeof(DatingSite.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(DatingSite.App_Start.NinjectWebCommon), "Stop")]

namespace DatingSite.App_Start
{
using System;
using System.Web;

using Microsoft.Web.Infrastructure.DynamicModuleHelper;

using Ninject;
using Ninject.Web.Common;
using DatingSite.Services;
using DatingSite.Data;

public static class …
Run Code Online (Sandbox Code Playgroud)

ninject asp.net-web-api asp.net-mvc-5

72
推荐指数
4
解决办法
5万
查看次数

ObjectStateManager中已存在具有相同键的对象.ObjectStateManager无法使用相同的键跟踪多个对象

使用带有通用存储库模式的EF5和ninject用于依赖性损害并在尝试使用存储过程与我的edmx将实体更新到数据库时遇到问题.

我在DbContextRepository.cs中的更新是:

public override void Update(T entity)
{
    if (entity == null)
        throw new ArgumentException("Cannot add a null entity.");

    var entry = _context.Entry<T>(entity);

    if (entry.State == EntityState.Detached)
    {
        _context.Set<T>().Attach(entity);
        entry.State = EntityState.Modified;
    }
}
Run Code Online (Sandbox Code Playgroud)

从我的AddressService.cs回到我的存储库我有:

 public int Save(vw_address address)
{
    if (address.address_pk == 0)
    {
        _repo.Insert(address);
    }
    else
    {
        _repo.Update(address);
    }

    _repo.SaveChanges();

    return address.address_pk;
}
Run Code Online (Sandbox Code Playgroud)

当它命中Attach和EntityState.Modified时,它会发出错误:

ObjectStateManager中已存在具有相同键的对象.ObjectStateManager无法使用相同的键跟踪多个对象.

我已经查看了堆栈和互联网上的许多建议,但没有提出解决它的任何建议.任何工作都将受到赞赏.

谢谢!

c# entity-framework ninject repository-pattern entity-framework-5

71
推荐指数
3
解决办法
7万
查看次数

OwinStartup时如何使用DI容器

这是一个Web API 2项目.

当我使用Ninject实现DI时,我收到一条错误消息

尝试创建"TokenController"类型的控制器时发生错误.确保控制器具有无参数的公共构造函数.

[assembly: OwinStartup(typeof(Web.Startup))]

namespace Web
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
            ConfigureWebApi(app);
        }
    }
}

public class TokenController : ApiController
{

    private IUserService _userService;

    public TokenController(IUserService userService)
    {
        this._userService = userService;
    }

    [Route("api/Token")]
    public HttpResponseMessage PostToken(UserViewModel model)
    {
        if (_userService.ValidateUser(model.Account, model.Password))
        {
            ClaimsIdentity identity = new ClaimsIdentity(Startup.OAuthBearerOptions.AuthenticationType);
            identity.AddClaim(new Claim(ClaimTypes.Name, model.Account));
            AuthenticationTicket ticket = new AuthenticationTicket(identity, new AuthenticationProperties());
            var currentUtc = new SystemClock().UtcNow;
            ticket.Properties.IssuedUtc = currentUtc;
            ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(30));
            return new …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection ninject asp.net-web-api owin

64
推荐指数
2
解决办法
5万
查看次数

使用Ninject在构造函数中使用其他参数创建实例

我决定开始使用Ninject并面临一个问题.说我有以下场景.我有一个IService接口和2个实现此接口的类.而且我还有一个类,它有一个构造函数获取IService和一个int.如何使用Ninject创建此类的实例(我不想硬连接这个int,我想在每次获取实例时都传递它)?

以下是一些说明情况的代码:

interface IService
{
    void Func();
}

class StandardService : IService
{
    public void Func()
    {
        Console.WriteLine("Standard");
    }
}

class AlternativeService : IService
{
    public void Func()
    {
        Console.WriteLine("Alternative");
    }
}


class MyClass
{
    public MyClass(IService service, int i)
    {
        this.service = service;
    }

    public void Func()
    {
        service.Func();
    }

    IService service = null;
}
class Program
{
    static void Main(string[] args)
    {
        IKernel kernel = new StandardKernel(new InlineModule(
            x => x.Bind<IService>().To<AlternativeService>(),
            x => x.Bind<MyClass>().ToSelf())); …
Run Code Online (Sandbox Code Playgroud)

c# ninject ioc-container

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

在WebApi中使用HttpContext.Current是危险的,因为异步

我的问题与此有点相关:具有依赖注入的HttpContext.Items的WebApi等价物.

我们想使用Ninject在WebApi区域中使用HttpContext.Current注入一个类.

我担心的是,这可能非常危险,因为在WebApi(一切?)是异步的.

如果我在这些方面有误,请纠正我,这是我到目前为止调查的内容:

  1. HttpContext.Current通过Thread获取当前上下文(我直接查看了实现).

  2. 在异步任务中使用HttpContext.Current是不可能的,因为它可以在另一个Thread上运行.

  3. WebApi使用IHttpController和method Task<HttpResponseMessage> ExecuteAsync=>每个请求都是async =>你不能在action方法中使用HttpContext.Current.它甚至可能发生,更多的请求是通过相同的线程在同一个线程上执行的.

  4. 为了创建带有注入内容的控制器到构造函数中,IHttpControllerActivator与sync方法一起使用IHttpController Create.这是,ninject创建Controller及其所有依赖项.


  • 如果我在所有这4点中都是正确的,那么在动作方法或下面的任何层中使用HttpContext.Current是非常危险的,并且可能会产生意外结果.我看到很多公认的答案正是如此.恕我直言,这可以工作一段时间,但会在负载下失败.

  • 但是当使用DI创建一个Controller及其依赖项时,它是好的,因为它运行在一个独立的线程上.我可以从构造函数中的HttpContext获取一个值,它会安全吗?.我想知道每个Controller是否在每个请求的单个线程上创建,因为这可能会导致重负载下的问题,其中可以使用来自IIS的所有线程.

只是为了解释为什么我要注入HttpContext的东西:

  • 一种解决方案是在控制器动作方法中获取请求,并将所有层的所需值作为参数传递,直到它在代码深处使用.
  • 我们想要的解决方案:它们之间的所有层都没有被这个感染,我们可以在代码深处使用注入的请求(例如在一些依赖于URL的ConfigurationProvider中)

    如果我完全错误或者我的建议是正确的,请告诉我你的意见,因为这个主题似乎非常复杂.Thx提前!

multithreading asynchronous ninject httpcontext asp.net-web-api

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

Ninject模块的目的是什么?

我是ninject的完全新手

我一直在拉开其他人的代码,发现了几个nInject模块实例 - 从Ninject.Modules.Module派生的类,并且有一个包含大部分代码的加载方法.

通过调用StandardKernel实例的LoadModule方法并将其传递给模块类的实例来调用这些类.

也许我在这里遗漏了一些明显的东西,但是这对于创建一个普通的旧类并调用它的方法,或者使用静态方法的静态类有什么好处呢?

 

c# dependency-injection module ninject module-pattern

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