标签: ninject

我应该在哪里注射Ninject 2+(我如何安排我的模块?)

我有一个解决方案,有两个相关的(对这个问题)项目,还有一些其他项目;

  1. 具有其他几个项目使用的功能的类库.
  2. ASP.NET MVC应用程序.

我的问题基本上是我应该使用Ninject 2做IoC,考虑到......

  • 类库需要一些DI爱,其中包括需要Web请求特定会话对象的存储库类(想想工作单元).
  • MVC应用程序需要DI,因为在Ninject 2中你基本上都是从NinjectHttpApplication继承的.
  • 类库的单元测试需要注意这一点,以注入一组不同的存储库.
  • 出于同样的原因,需要注入Web应用程序的单元测试.

我把自己画成了一个心理角落,因为我只看到了三个选项.类库中的DI,Web应用程序中的DI,或两者都有,但每个都有问题:

  • 我不能在类库中做DI ,因为MVC应用程序需要从NinjectHttpApplication继承而开始.
  • 我不能只在MVC应用程序中执行DI - 毕竟,类库是由其他库使用的,并且MVC应用程序不应该对库的内部结构有太多了解.
  • 我想这是我能看到的唯一出路:两个项目的独立IoC.类库和MVC应用程序都有自己的IoC设置,并为他们的东西做DI,而不是真正关心彼此.

有没有人对如何做这样的事情有一些"最佳实践"或指导方针?我无法想象我是第一个在这种情况下结束的人,而且知道"正确"的做法是什么肯定会很好......

谢谢!

asp.net-mvc ninject inversion-of-control

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

是否可以将不同的接口绑定到实现所有接口的同一个实例?

我有以下(简化)情况:我有两个接口

interface IAmAnInterface
{
    void DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

interface IAmAnInterfaceToo
{
    void DoSomethingElse();
}
Run Code Online (Sandbox Code Playgroud)

和一个实现两者的类:

class IAmAnImplementation: IAmAnInterface, IAmAnInterfaceToo
{
    public IAmAnImplementation()
    {
    }

    public void DoSomething()
    {
    }

    public void DoSomethingElse()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我使用Ninject将同一个类绑定到两个接口.因为我想要使用相同IAmAnImplementationbeeing 实例,IAmAnInterface而且IAmAnInterfaceToo很明显我需要某种单例.我和ninject.extensions.namedscope一起,InScope()但没有成功.我的最后一次尝试是:

Bind<IAmAnImplementation>().ToSelf().InSingletonScope();
Bind<IAmAnInterface>().To<IAmAnImplementation>().InSingletonScope();
Bind<IAmAnInterfaceToo>().To<IAmAnImplementation>().InSingletonScope();
Run Code Online (Sandbox Code Playgroud)

但不幸的是,当我通过kernel.Get<IDependOnBothInterfaces>();它请求我的测试类的实例时实际上使用了不同的实例IAmAnImplementation.

class IDependOnBothInterfaces
{
    private IAmAnInterface Dependency1 { get; set; }
    private IAmAnInterfaceToo Dependency2 { get; set; }

    public IDependOnBothInterfaces(IAmAnInterface i1, …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection ninject inversion-of-control ninject-3

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

使用Asp.Net MVC和Web Api配置Ninject

我已经设置了我的项目Ninject IoC.
我的项目有常规Asp.Net MVC控制器和Web Api控制器.现在,Ninject使用Web ApiNinject不适用于常规Asp.MVC控制器.
我的常规MVC控制器实现;

public class GalleryController : BaseController
{
    public GalleryController(IUow uow)
    {
        Uow = uow;
    }
    ........
}
Run Code Online (Sandbox Code Playgroud)

与常规控制器一起使用时出错

An error occurred when trying to create a controller of type 'Web.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor.]
Run Code Online (Sandbox Code Playgroud)

但是,当我使用Web Api尝试相同的代码时,它可以工作

public class GalleryController : BaseApiController
{
    public GalleryController(IUow uow)
    {
        Uow = …
Run Code Online (Sandbox Code Playgroud)

asp.net asp.net-mvc dependency-injection ninject repository-pattern

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

With.Parameters.ConstructorArgument with ninject 2.0

如何在ninject 2.0中使用此功能?

MyType obj = kernel.Get<MyType>(With.Parameters.ConstructorArgument("foo","bar"));
Run Code Online (Sandbox Code Playgroud)

"With"不存在:(

c# ninject

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

Ninject MVC3 - 引导程序抛出"已经初始化"的异常

我创建了一个空的Asp.Net MVC3项目,并使用了nuget install-package Ninject.MVC3

没有做任何其他事情(没有注册服务,甚至没有创建控制器)我运行应用程序.

项目在NinjectMVC3.cs的第22行中断,但有以下异常:

[InvalidOperationException:已经初始化!] Ninject.Web.Mvc.Bootstrapper.Initialize(Func`1 createKernelCallback)在c:\ Projects\Ninject\Maintenance2.2 \ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\Bootstrapper.cs>:58 Mvc.App_Start.NinjectMVC3.Start()在c:\ Projects\Events\Events\App_Start\NinjectMVC3.cs:22

[TargetInvocationException:调用目标抛出了异常.]
System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo方法,Object target,Object []参数,SignatureStruct&sig,MethodAttributes methodAttributes,RuntimeType typeOwner)+0
System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo)方法,Object target,Object [] arguments,Signature sig,MethodAttributes methodAttributes,RuntimeType typeOwner)+72
System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object [] parameters,CultureInfo culture,Boolean skipVisibilityChecks)+ 335
System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object [] parameters,CultureInfo culture)+28
System.Reflection.MethodBase.Invoke(Object obj,Object [] parameters)+19
WebActivator.BaseActivationMethodAttribute. InvokeMethod()+199 WebActivator.ActivationManager.RunActivationMethods()+330 WebActivator.ActivationManager.R unPreStartMethods()+27 WebActivator.ActivationManager.Run()+39

NinjectMVC3.cs中的行是:

public static void Start() 
        {
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestModule));
            DynamicModuleUtility.RegisterModule(typeof(HttpApplicationInitializationModule));
            bootstrapper.Initialize(CreateKernel); // <- this one right here...
        }
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?我已经在其他项目中使用Ninject for MVC3而没有任何问题.我注意到Start()方法中的第二行没有包含在Ninject.MVC3的旧(周)包中,所以也许在最近的更新中还有其他东西被打破了?

请帮忙!

编辑以解决雷莫的回答

这是来自我的global.asax.cs

 public class MvcApplication : System.Web.HttpApplication
 { …
Run Code Online (Sandbox Code Playgroud)

.net c# ninject asp.net-mvc-3

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

结合DI和构造函数参数?

如何将构造函数注入与"手动"构造函数参数组合?即.

public class SomeObject
{
    public SomeObject(IService service, float someValue)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我的DI容器应该解析/注入IService,并且应该指定someValue.我该如何混合这两个?

c# ninject dependency-management

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

asp.net mvc 3中的错误处理

是否有内置或正确的方法来处理asp.net mvc 3中的错误?

这就是我想要做的:

  1. 如果应用程序崩溃或抛出错误,它将转到特定的错误页面.
  2. 我可以从控制器操作中抛出自己的错误.(它会进入错误页面).

我找到了以下方法:

  1. 我看到有一个很长的路要走做到这一点 在这里.(对于v1和v2,但也适用于v3).
  2. 在这里使用errorhandle属性.

我该如何正确处理?

如果解决方案类似或类似于上面列表中的#1,我使用ninject并且我还没有创建基类.我怎么做呢?

error-handling asp.net-mvc ninject asp.net-mvc-3

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

Ninject InRequestScope缺失

关于ninject的最新版本(2.2.1.4)有几个问题.

试图将Linq2sql绑定DataContext到具体实现InRequestScope(在类库项目中)

Bind<DataContext>().To<MoneywatchDataContext>()
Run Code Online (Sandbox Code Playgroud)

但找不到InRequestScope方法

在此输入图像描述

最后这样做,

Bind<DataContext>().To<MoneywatchDataContext>().InScope(ctx => HttpContext.Current)
Run Code Online (Sandbox Code Playgroud)

只是想知道是否:

  1. 如果它的行为与InRequestScopeMethod 完全相同.
  2. 它将保证当我HTTContext.Current的GC被用时,底层DataCotext也将被处理掉.

c# binding ninject ninject-2

34
推荐指数
3
解决办法
7521
查看次数

验证:如何使用Ninject注入模型状态包装器?

我正在查看本教程http://asp-umb.neudesic.com/mvc/tutorials/validating-with-a-service-layer--cs,了解如何围绕包装器包装我的验证数据.

我想使用依赖注入.我正在使用ninject 2.0

namespace MvcApplication1.Models
{
    public interface IValidationDictionary
    {
        void AddError(string key, string errorMessage);
        bool IsValid { get; }
    }
}
Run Code Online (Sandbox Code Playgroud)

//包装

using System.Web.Mvc;

namespace MvcApplication1.Models
{
    public class ModelStateWrapper : IValidationDictionary
    {

        private ModelStateDictionary _modelState;

        public ModelStateWrapper(ModelStateDictionary modelState)
        {
            _modelState = modelState;
        }

        #region IValidationDictionary Members

        public void AddError(string key, string errorMessage)
        {
            _modelState.AddModelError(key, errorMessage);
        }

        public bool IsValid
        {
            get { return _modelState.IsValid; }
        }

        #endregion
    }
}
Run Code Online (Sandbox Code Playgroud)

//控制器

private IProductService _service;

public ProductController() 
{ …
Run Code Online (Sandbox Code Playgroud)

c# ninject ioc-container modelstate asp.net-mvc-2

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

Ninject 3中.ToConstructor和.ToMethod有什么区别?

在Ninject3中有一个新的.ToConstructor功能.

如上所述,它有助于强类型构造函数参数,如:

Bind<IMyService>().ToConstructor(
    ctorArg => new MyService(ctorArg.Inject<IFoo>(), ctorArg.Inject<IBar>()));
Run Code Online (Sandbox Code Playgroud)

以几乎相同的方式使用.ToConstructor.ToMethod之间的区别是什么?

Bind<IMyService>().ToMethod(
    x => new MyService(x.Kernel.Get<IFoo>(), x.Kernel.Get<IBar>()));
Run Code Online (Sandbox Code Playgroud)

它只是一个语法糖,以避免使用Kernel.Get <>()或还有更多我缺少的东西?

c# ninject

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