我一直在帮助一些项目的朋友,有一个使用Ninject的课程.我是C#的新手,我不知道那个班级在做什么,这就是我需要了解Ninject的原因.任何人都可以解释Ninject是什么以及什么时候使用它(如果可能,请举例说明)?或者,如果你可以指出一些很棒的链接.
我试过这个问题:Ninject教程/文档?但它并没有真正帮助像我这样的初学者.
我正在为asp.net mvc 3编写自定义授权过滤器.我需要向用户服务注入类,但我不知道如何做到这一点.
public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
private IUserService userService;
private string[] roles;
public AuthorizeAttribute(params string[] roles)
{
this.roles = roles;
}
public void OnAuthorization(AuthorizationContext filterContext)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用ninject进行依赖注入.我不想使用Factory或服务定位器模式.
我的绑定在global.acsx中看起来像这样:
internal class SiteModule : NinjectModule
{
public override void Load()
{
Bind<IUserService>().To<UserService>();
}
}
Run Code Online (Sandbox Code Playgroud) 我想开始使用Dependency Injection和IOC,我想更多地使用Ninject.
有没有使用Ninject编写的源代码可用的好应用程序,我可以将其视为参考?
我在一个新的Web应用程序上使用NInject,有两件事我不清楚:
我是否需要保持对内核(Session/App变量)的引用以确保GC不收集我的所有实例?例如,如果我指定.Using()然后收集Kernel对象,那么我的所有"单身人士"都不是被收集的吗?
如果我确实需要保持对Kernel对象的引用,我如何允许传入WithArguments()的参数改变或者这是不可能的.
c# dependency-injection ninject ioc-container inversion-of-control
我正在尝试将一个通用的IRepository <>接口绑定到我的通用存储库<> - 但它总是返回null?
我尝试过各种各样的事情:
Bind(typeof(IRepository<CustomerModel>)).To(typeof(Repository<CustomerModel>));
Bind(typeof(IRepository<>)).To(typeof(Repository<>));
Run Code Online (Sandbox Code Playgroud)
但是,如果我传入非通用接口和类,那么它就像梦一样?
在使用NuGet为SQL Server CE添加实体框架代码之后,为我生成了此代码.他们没有对任何其他文件进行任何更改.该文件SQLCEEntityFramework.cs已创建并放在App_Start文件夹中.
这是否意味着它会自动执行或者其他什么?当我为MVC 3添加Ninject时也发生了同样的事情.没有代码被添加到global.ascx文件中所以我不知道它的即插即用或者我必须配置一些东西.
[assembly: WebActivator.PreApplicationStartMethod(typeof(StackTorrents.WebUI.App_Start.SQLCEEntityFramework), "Start")]
Run Code Online (Sandbox Code Playgroud) 任何人都可以告诉我是否可以使用Ninject注册已经创建的类实例,以便每次需要注入时它都会使用此实例?
我想你可以称之为单身,但我已经创建了实例.所有文档都指向创建类的新实例.
我已经定义了一个接口和一个类:
public interface IRepository<T>
{
}
public class RoleRepository:IRepository<Domain_RoleInfo>
{
}
Run Code Online (Sandbox Code Playgroud)
在这里注入:
public RoleService
{
[Inject]
public RoleService(IRepository<Domain_RoleInfo> rep)
{
_roleRep=rep;
}
}
Run Code Online (Sandbox Code Playgroud)
如何使用Ninject执行依赖注入,说明如何绑定?
我已经编写了一个如下所示的辅助类,它可以与非泛型接口一起工作.但是如何重构它支持如上所述的通用接口?
public class RegisterNinjectModule : NinjectModule
{
public override void Load()
{
BindServices();
BindRepositories();
}
private void BindServices()
{
FindAndBindInterfaces("RealMVC.Service.Interfaces", "RealMVC.Services");
}
private void BindRepositories()
{
FindAndBindInterfaces("RealMVC.Repository.Interfaces", "RealMVC.Repositories");
}
private void FindAndBindInterfaces(string interfaceAssemblyName, string implAssemblyName)
{
//Get all interfaces
List<Type> interfaces = Assembly.Load(interfaceAssemblyName).GetTypes().AsQueryable().Where(x => x.IsInterface).ToList();
IQueryable<Type> ts = Assembly.Load(implAssemblyName).GetTypes().AsQueryable().Where(x => x.IsClass);
foreach (Type intf in interfaces) …Run Code Online (Sandbox Code Playgroud) 更新 - 请查看我的答案,找到解决此问题的链接和说明
在我们开始之前,我知道这是一个非常常见的问题,我一直在使用Ninject进行许多卫星没有问题,但是现在它出现了,我无法找到解决办法.此外,不,迄今为止谷歌和SO的结果都没有帮助我.
因此,请考虑从Windows Server 2008 R2上的Visual Studio 2012中的非常非常非常简单的原型ASP.NET MVC 4项目上运行的以下代码:
public class DefaultController : Controller {
private IGroupPrincipalRepository GroupPrincipalRepository { get; set; }
[Inject]
public DefaultController(
IGroupPrincipalRepository groupPrincipalRepository) {
this.GroupPrincipalRepository = groupPrincipalRepository;
}
}
Run Code Online (Sandbox Code Playgroud)
这是NinjectWebCommon.cs RegisterServices方法:
kernel.Bind(typeof(IGroupPrincipalRepository)).ToConstructor(
c =>
new GroupPrincipalRepository(new PrincipalContext(ContextType.Domain, "?", "?", "?", "?"))).InSingletonScope();
Run Code Online (Sandbox Code Playgroud)
现在,这就是我使用Ninject的其他项目(但是.NET 4上的ASP.NET MVC 3)的工作原理,据我所知,这是使一切正常运行所需要的.那么,为什么我突然得到为此对象定义的无参数构造函数.异常?
UPDATE
这是完整的NinjectWebCommon.cs文件:
[assembly: WebActivator.PreApplicationStartMethod(typeof(App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(App_Start.NinjectWebCommon), "Stop")]
namespace App_Start {
using System;
using System.DirectoryServices.AccountManagement;
using System.Repositories.ActiveDirectory;
using System.Web;
using Microsoft.Web.Infrastructure.DynamicModuleHelper;
using …Run Code Online (Sandbox Code Playgroud) 在使用OWIN请求管道创建ApplicationUserManager时,使用依赖项注入创建自定义UserStore时遇到问题.
背景
我正在尝试将我们的Web应用程序中的用户功能从使用SimpleMembership迁移到新的ASP.NET标识.在启动新的MVC 5项目时,单页面应用程序的默认实现使用ASP.Identity,使用Entity Framework实现UserStore功能.
在我的例子中,我们已经使用NHibernate作为ORM,并使用ninject实现工作单元模式,以便每个请求有一个NHibernate会话,我想让ASP.Identity与我们现有的框架一起工作.
为此,我创建了一个自定义UserStore,可以通过注入相关的存储库/ nhibernate会话等来创建.然后可以使用Ninject将其注入Controller的构造函数,而不是使用默认实现的GetOwinContext功能.
为了做到这一点,我在Startup的ConfigureAuth(IAppBuilder app)方法中注释掉了以下行,默认情况下会创建UserManager类:
// app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
Run Code Online (Sandbox Code Playgroud)
相反,我使用了在安装Ninject.Web.Common.Webhost nuget包时创建的NinjectWebCommon来创建相关的绑定.
这个实现在一些UserManager操作中运行良好,但是对于一些操作,例如ResetPasswordAsync,它失败了,因为没有调用默认的ApplicationUserManager实现,因此从未设置UserManager类中的UserTokenProvider:
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
// Register two factor authentication providers. …Run Code Online (Sandbox Code Playgroud)