我有一个解决方案,有两个相关的(对这个问题)项目,还有一些其他项目;
我的问题基本上是我应该使用Ninject 2做IoC,考虑到......
我把自己画成了一个心理角落,因为我只看到了三个选项.类库中的DI,Web应用程序中的DI,或两者都有,但每个都有问题:
有没有人对如何做这样的事情有一些"最佳实践"或指导方针?我无法想象我是第一个在这种情况下结束的人,而且知道"正确"的做法是什么肯定会很好......
谢谢!
我有以下(简化)情况:我有两个接口
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将同一个类绑定到两个接口.因为我想要使用相同的IAmAnImplementation
beeing 实例,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
我已经设置了我的项目Ninject IoC
.
我的项目有常规Asp.Net MVC
控制器和Web Api
控制器.现在,Ninject
使用Web Api
但Ninject
不适用于常规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
如何在ninject 2.0中使用此功能?
MyType obj = kernel.Get<MyType>(With.Parameters.ConstructorArgument("foo","bar"));
Run Code Online (Sandbox Code Playgroud)
"With"不存在:(
我创建了一个空的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) 如何将构造函数注入与"手动"构造函数参数组合?即.
public class SomeObject
{
public SomeObject(IService service, float someValue)
{
}
}
Run Code Online (Sandbox Code Playgroud)
我的DI容器应该解析/注入IService,并且应该指定someValue.我该如何混合这两个?
是否有内置或正确的方法来处理asp.net mvc 3中的错误?
这就是我想要做的:
我找到了以下方法:
我该如何正确处理?
如果解决方案类似或类似于上面列表中的#1,我使用ninject并且我还没有创建基类.我怎么做呢?
关于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)
只是想知道是否:
InRequestScope
Method 完全相同.HTTContext.Current
的GC被用时,底层DataCotext
也将被处理掉.我正在查看本教程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) 在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 <>()或还有更多我缺少的东西?
ninject ×10
c# ×7
asp.net-mvc ×3
.net ×1
asp.net ×1
binding ×1
modelstate ×1
ninject-2 ×1
ninject-3 ×1