我现在正在使用Ninject 2.2.1.4,使用我的MVC3,我成功配置Ninject运行它,但我不知道如何在我的MVC3中使用Quartz.Net运行Ninject任何人都可以帮忙吗?
我有一个ASP.NET MVC Web应用程序,它实现了自定义成员资格提供程序.自定义成员资格提供程序使用UserRepository
其构造函数,该构造函数提供成员资格提供程序和NHibernate之间的接口.它UserRepository
由Ninject IoC容器提供.
但是,显然,当.NET实例化提供程序时,这不起作用:无参数构造函数没有UserRepository而无法创建一个(UserRepository需要将NHibernate会话传递给它的构造函数),这意味着提供者无法访问其数据存储.如何解决对象依赖?
值得注意的是,这是一个已经使用Ninject进行改造的现有应用程序.以前我使用无参数构造函数,它们能够与参数化构造函数一起创建所需的依赖项,以帮助进行单元测试.
有什么想法,还是我把自己建在一个角落里?
这可能是一个愚蠢的问题,但我正在寻找Ninject来源,并没有看到NInject注册自己的控制器工厂.我也没有IControllerFactory
在Ninject.Web.Mvc
集会中看到任何课程.我错过了什么吗?Ninject如何创建控制器并将参数注入构造函数?
我正在使用Ninject 2.0在我的一个应用程序中处理DI,而且我遇到了令我困惑的事情.说实话,零文档并没有太大帮助.
假设我有一个带签名的构造函数 -
ctor(IServiceFactory factory1, IServiceFactory factory2)
{
this.factory1 = factory1;
this.factory2 = factory2;
}
Run Code Online (Sandbox Code Playgroud)
虽然这两个服务实现了相同的接口,但它们是完全不同的实现,并且在不同的时间使用,因此我不想注入IEnumerable<IServiceFactory>
.
我的问题是,当我绑定实例时,如何告诉Ninject每个注入的内容?
提前致谢.
为了让任何想要看到代码的人在阅读雷莫的链接后结束,...这里简单介绍一下.(我从未意识到C#有参数属性!)
//abstract factory
public interface IServiceFactory
{
Service Create();
}
//concrete factories
public class Service1Factory : IServiceFactory
{
public IService Create()
{
return new Service1();
}
}
public class Service2Factory : IServiceFactory
{
public IService Create()
{
return new Service2();
}
}
//Binding Module (in composition root)
public class ServiceFactoryModule : NinjectModule
{
public override void Load()
{ …
Run Code Online (Sandbox Code Playgroud) 我有下面的代码一个可以绑定到我的用户存储库,另一个可以绑定到缓存.我应该为UserRepository和Cache使用什么范围.UserRepository上的Scope应该是Singleton吗?
this.Bind<IUserRepository>().To<UserRepositary>().InRequestScope();
this.Bind<IDistributedCacheService>().To<DistributedCacheService>().InSingletonScope();
Run Code Online (Sandbox Code Playgroud) 在使用Ninject.MVC 2.2.0.3(合并之后)的MVC3应用程序中,而不是将repostories直接注入控制器,我试图创建一个包含businesslogic的服务层并在那里注入repostories.我将ninject-DependencyResolver作为动态对象传递给服务层(因为我不想在那里引用mvc或ninject).然后我在其上调用GetService来获取我在NinjectHttpApplicationModule中指定的绑定和生命周期的存储库.编辑:简而言之,它失败了.
在这种情况下,如何将IoC容器传递给服务层?(不同的方法也非常受欢迎.)
编辑:这是一个例子来说明我如何理解答案和评论.
我应该避免服务定位器(反)模式,而是使用依赖注入.所以我想说我想在Northwind中为产品和类别创建一个管理站点.我根据表定义创建模型,存储库,服务,控制器和视图.此时服务直接调用存储库,没有逻辑.我有功能支柱,视图显示原始数据.这些绑定是为NinjectMVC3配置的:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<ICategoryRepository>().To<CategoryRepository>();
kernel.Bind<IProductRepository>().To<ProductRepository>();
}
Run Code Online (Sandbox Code Playgroud)
存储库实例是由ninject通过ProductController中的两层构造函数注入创建的:
private readonly ProductsService _productsService;
public ProductController(ProductsService productsService)
{
// Trimmed for this post: nullchecks with throw ArgumentNullException
_productsService = productsService;
}
Run Code Online (Sandbox Code Playgroud)
和产品服务:
protected readonly IProductRepository _productRepository;
public ProductsService(IProductRepository productRepository)
{
_productRepository = productRepository;
}
Run Code Online (Sandbox Code Playgroud)
我现在没有必要解耦服务,但已准备好模拟数据库.
要在Product/Edit中显示类别下拉列表,我创建一个ViewModel,除了Product之外还包含类别:
public class ProductViewModel
{
public Product Product { get; set; }
public IEnumerable<Category> Categories { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
ProductsService现在需要CategoriesRepository来创建它.
private readonly ICategoryRepository _categoryRepository; …
Run Code Online (Sandbox Code Playgroud) asp.net-mvc ninject inversion-of-control ninject-2 asp.net-mvc-3
我刚刚在一个新项目上做了File - > New Project.啊,绿色田野的气味.
我正在使用刚刚发布的ASP.NET MVC 2(即没有预览或发布候选版本,真实的东西),并且认为我使用Ninject 2(也是已发布的版本)与MVC扩展开始了一个良好的开端.我下载了MVC扩展项目,在VS2008Sp1中打开它,在发布模式下构建它,然后进入mvc2\build\release文件夹并将Ninject.dll和Ninject.Web.Mvc.dll从那里复制到我的Libraries文件夹中项目(这样我就可以在源代码管理中把它们拉到一边,并且每个地方都有正确的版本).我没有包含相应的.xml文件 - 我应该吗?他们只提供智能感知或其他功能吗?我相信没什么大不了的.
Anyhoo,我遵循了我能找到的最新建议; 我在我的MVC2项目中引用了DLL,然后开始使用Global.asax.cs.首先,我让它继承自NinjectHttpApplication.我删除了Application_Start()方法,并改为使用OnApplicationStarted().这是方法:
protected override void OnApplicationStarted()
{
base.OnApplicationStarted();
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
// RegisterAllControllersIn(Assembly.GetExecutingAssembly());
}
Run Code Online (Sandbox Code Playgroud)
我也遵循VS的建议并实现了CreateKernel方法:
protected override Ninject.IKernel CreateKernel()
{
// RegisterAllControllersIn(Assembly.GetExecutingAssembly());
return new StandardKernel();
}
Run Code Online (Sandbox Code Playgroud)
就这些.没有其他修改项目.
您会注意到RegisterAllControllersIn()方法在上面的两个地方被注释掉了.我想我可以用三种不同的组合来运行它,所有这些都带有时髦的副作用;
然后,我将获得标准的"欢迎使用ASP.NET MVC"页面的所有荣耀.但是,在浏览器中正确显示此页面后,VS会向我显示抛出的异常.它抛出NinjectControllerFactory.GetControllerInstance(),它在controllerType参数中使用NULL值调用.请注意,这是在/ Home页面呈现后发生的 - 我不知道为什么再次调用它,并且通过使用断点我已经确定已成功调用了HomeController的GetControllerInstance().为什么这个带有controllerType的新调用为null?我真的不知道.此时按F5将我带回浏览器,没有任何投诉.
这是东西真正开始变得时髦的地方.现在我收到404错误.有时我在RegisterAllControllersIn()行上也得到了一个ArgumentNullException,但这种情况非常罕见,而且我无法重现它.
(并将注释放回CreateKernel()中的注释)
结果似乎与第1点中的行为完全相同.
因此,为了永远不进行 - 是否有关于如何使用Ninject 2(两个非beta版本)设置MVC 2项目以获取Ninject提供的控制器的确切分步指南?当然,我将开始提供一些实际的注入东西(如ISession对象和存储库,记录器等),但我想我会先让它工作.
任何帮助将非常感谢!
(也发布到Ninject Google Group)
我有一个问题,似乎与http://markmail.org/message/6rlrzkgyx3pspmnf中描述的问题非常相似,如果您使用不同的服务类型访问它,实际上创建的单个实例不仅仅是单个实例.
我正在使用最新版本的Ninject 2 for Compact Framework,我遇到的确切问题是,如果我将相同的提供程序方法绑定到:
Func<Service> serviceCreator = () => new Service(false);
kernel.Bind<IService>().ToMethod(serviceCreator).InSingletonScope();
kernel.Bind<Service>().ToMethod(serviceCreator).InSingletonScope();
Run Code Online (Sandbox Code Playgroud)
如果我将它们解析为IService和Service,它似乎创建了2个Service实例.
这在解析Service时会导致循环依赖性异常.
这是设计,还是一个bug?
有没有办法在不使用[Inject]
属性的情况下在Ninject 2中使用Property Injection ?这会在类中使用Ninject创建一个依赖项,我宁愿避免对IoC容器有不必要的依赖,这就是我最常使用Constructor Injection的原因.
我想这同样适用于方法注入
Kernel.Get()线程安全吗?我的目标是在我的所有组件中共享我的内核实例,他们可能会在不同的线程上同时调用Kernel.Get().
Kernel.Get()线程安全吗?
在所有位于不同dll中的应用程序组件之间共享应用程序内核的最佳模式是什么?如果这是有意义的,我不希望将工厂的实例传递给我的应用程序的每个组件.