Tag: ninject

使用MVC和Ninject作为IoC容器构建WinForms应用程序

我不得不重新编写一个大型的WinForms应用程序,我想使用MVC来增加测试能力等。我也想采用Ninject作为我的IoC容器,因为它重量轻,速度快,并且会增加我的应用程序的可扩展性。 我已经做了很多阅读,并且我已经成功地开始了这个新应用程序的结构。 但是,在使用Ninject时,我不确定我是否有正确的想法。 代码… 从Program.cs和相关类开始…… static class Program { [STAThread] static void Main() { FileLogHandler fileLogHandler = new FileLogHandler(Utils.GetLogFilePath()); Log.LogHandler = fileLogHandler; Log.Trace(“Program.Main(): Logging initialized”); CompositionRoot.Initialize(new ApplicationModule()); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(CompositionRoot.Resolve()); } } public class CompositionRoot { private static IKernel _ninjectKernel; public static void Initialize(INinjectModule module) { _ninjectKernel = new StandardKernel(module); } public static T Resolve() […]

使用Ninject 2将参数传递给WCF ServiceHost类型

我想使用Ninject.Wcf扩展来创建参数化服务主机实例。 例如,我有一个MyWCFHandler类,只有以下构造函数: public MyWCFHandler(UserManager manager) { _manager = manager; } 但是当我写var myServiceHost = new ServiceHost(typeof(MyWCFHandler)); 我无法将依赖项对象传递给构造函数。 我不想搞乱我在如何将值传递给我的wcf服务上的构造函数中提供的自定义ServiceHost ? 我决定采用Ninject的方式,但不能完全理解如何在我的情况下采取行动。 以下是我理解Ninject中的WCF扩展的工作原理: 在我的项目中引用Ninject和Ninject.Extensions.WCF。 创建一个inheritanceNinject模块的类,并编写如下内容: internal class ServiceModule : NinjectModule { public override void Load() { Bind().To().WithConstructorParameters(myUserManagerIwantToUseInWCFHandler); } } 将使用新ServiceModule()初始化的内核添加到KernelContainer。 像这样使用NinjectServiceHost: var service = KernelContainer.Kernel.Get(); _host = new NinjectServiceHost( service ); 在那里我应该准备好我的主人打开。 问题是: 我应该如何将构造函数参数传递给NinjectModule? 当我准备好将参数绑定到它时,我应该创建NinjectModule的实例吗? 如何将它们传递给Get方法? 不幸的是,没有一个示例可以简单地显示参数化的ServiceHost启动。 我甚至不关心它是否是我使用的Ninject。 […]

带有Ninject的AutoMapper

我一直在尝试设置AutoMapper来通过Ninject实例化所有对象。 我在global.asax文件中有以下代码 Mapper.Configuration.ConstructServicesUsing(x => kernel.Get(x)); 作为一个例子,我有以下映射 Mapper.CreateMap(); 但是,这似乎不起作用。 我得到一个’IndexViewModel’没有默认构造函数的错误。 我可以通过显式告诉automapper在映射中使用ninject来使映射器工作。 Mapper.CreateMap().ConstructUsingServiceLocator(); 但是,我宁愿不必为每个映射执行此操作。 我错过了什么吗?

如何在Ninject中使用“复合设计模式”

validation规则合同: public interface IValidationRule { bool IsValid(); } 具体validation规则: public class MyClass : IValidationRule { public bool IsValid() { return true; } } 综合: public class ValidationRuleComposite : IValidationRule { private readonly IEnumerable _validationRules; public ValidationRuleComposite(IEnumerable validationRules) { _validationRules = validationRules; } public bool IsValid() { return _validationRules.All(x => x.IsValid()); } } 当我向IValidationRule询问IValidationRule我想得到ValidationRuleComposite 。 如果我向容器询问IValidationRule列表,我想获得除ValidationRuleComposite之外的所有IValidationRule实现。 […]

使用IAuthorizationFilter和Ninject和EF给DbContext配置错误

我正在尝试在IAuthorizationFilter的实现中使用我的UnitOfWork,但在我在几个页面之间导航后,我得到了这个exception: System.InvalidOperationException:无法完成操作,因为已释放DbContext。 FilterConfig.cs filters.Add(DependencyResolver.Current.GetService(typeof(PermissionFilter))); NinjectMappings.cs public class NinjectMappings : NinjectModule { public override void Load() { Bind().ToSelf().InRequestScope(); Bind().To(); } } PermissionFilter.cs public class PermissionFilter : IAuthorizationFilter { public PermissionFilter(IUnitOfWork unitOfWork) { // etc… } } 我能够解决这个问题: // NinjectMappings Bind() .ToMethod(m => GetUnitOfWork()) .WhenInjectedExactlyInto(typeof(PermissionFilter)); private IUnitOfWork GetUnitOfWork() { return new UnitOfWork(new MyContext()); } 现在的问题是GetUnitOfWork只在应用启动时调用一次。 我尝试在InTransientScope和InRequestScope之间交替无效。 因此,不会检索数据库的更新,而是我的UnitOfWork始终返回相同的数据。 […]

在ASP.NET MVC 3 Web App + Ninject + EF中为不同用户设置不同的连接字符串

我试图弄清楚如何在每个Web请求上设置不同的连接字符串。 这是我的情景: 一个基于asp.net mvc 3 + ninject +entity framework的webapp 一个单一的实体模型 三个具有相同模型的exception不同的数据库 我到目前为止尝试做的是通过覆盖基本控制器的OnActionExecuting方法来设置默认控制器工厂(传递正确的连接字符串)(每个控制器都从自定义基础inheritance)但是如果我尝试访问两个应该在不起作用的同时访问不同数据库的不同用户。 似乎第一个用户设置了他的连接字符串,第二个用户选择了已设置的连接字符串,而没有设置新的默认控制器。 这是一些代码…… // Base controller public class BaseController : Controller { protected override void OnActionExecuting(ActionExecutingContext filterContext) { var database = String.Empty; switch (Request.Url.Host) { case “aaa.domain.local”: database = “AAA”; break; case “bbb.domain.local”: database = “BBB”; break; case “ccc.domain.local”: database = “CCC”; break; } […]

WebAPI CORS和Ninject

我有一个具有ninject的ac #WebAPI项目,所有的get函数都在工作。 但是,每当我尝试发布时,我都会从api获得“Method Not Allowed”响应。 我已经阅读了一些地方,这是因为当api拒绝交叉来源呼叫时。 所以我使用了包管理器控制台并安装了Microsoft.AspNet.WebApi.Cors nugent包,并按照文章http://www.asp.net/web-api/overview/security/enabling-cross-origin的说明进行操作。 -requests-in-web-api 。 我的问题是现在Ninject不工作但抛出以下内容:尝试通过方法’System.Web.Http.GlobalConfiguration..cctor()’来访问字段’System.Web.Http.GlobalConfiguration.CS $ 9__CachedAnonymousMethodDelegate2’失败。“} 有人能帮我一下吗? 抛出错误的行是:System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = new Ninject.WebApi.DependencyResolver.NinjectDependencyResolver(kernel); Ninject配置文件 public static class NinjectWebCommon { private static readonly Bootstrapper bootstrapper = new Bootstrapper(); /// /// Starts the application /// public static void Start() { DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); bootstrapper.Initialize(CreateKernel); } /// /// Stops the application. /// public static […]

如何使用Ninject设置可选方法拦截?

假设我有一个类,我希望有时*(但现在总是)拦截一些(但不是全部)方法。 我理解它的方式,可以使用我的Ninject模块中的InterceptAround() (在更高级别的代码中),或者使用这些方法上的InterceptAttribute派生属性(在实现级别)来完成。 我真的不喜欢这样做的第一种方式,因为它需要消费者知道细节,有很多类有很多方法。 但我也不喜欢第二种方式,因为我没有看到如何禁用(或者更确切地说,不启用)拦截,因为属性与代码融合。 有没有一些已知的方法来解决这个问题? *:在应用程序的生命周期内。

ASP.NET 5 / MVC 6中基于约定的绑定

可以手动注册依赖项: services.AddTransient(); services.AddTransient(); 当依赖关系太多时,手动注册所有依赖项变得很困难。 在MVC 6(beta 7)中实现基于约定的绑定的最佳方法是什么? PS在以前的项目中,我使用Ninject和ninject.extensions.conventions 。 但我找不到MVC 6的Ninject适配器。

NamedScopes Ninject绑定和异步(线程)

我的项目由服务和存储库构成(所有存储库共享数据库上下文)。 在我的一个服务层中,我有一个使用存储库写入数据库的异步方法。 在此方法可以使用之前,Web请求将完成并处理上下文。 我试图理解这个答案中所述的NamedScopes 。 我似乎还无法理解如何实现它。 我将展示我的项目是如何构建的,并希望有人可以在代码级别帮助我。 绑定 private static void RegisterServices(IKernel kernel) { //dbcontext kernel.Bind().ToMethod(context => new EntityDatabaseContext()).InRequestScope(); //unit of work kernel.Bind().To().InRequestScope(); //repositories kernel.Bind<IRepository>().To<Repository>().InRequestScope(); //services kernel.Bind().To().InRequestScope(); } AuthenticationService使用构造函数注入 public AuthenticationService(UnitOfWork unitOfWork, IRepository accountRepository){} 我的AuthenticationService中的方法 //this is a background process public Task SomeMethodAsync(string text) { //spin it off into a new task return Task.Factory.StartNew(() => […]