我有一种情况,我想依赖注入我的用户对象,但也将当前用户放在IoC容器中.我想要以下几行:
kernel.Get<User>(); // Should return a new User()
kernel.Get<User>("Current"); // Should return the current user
Run Code Online (Sandbox Code Playgroud)
有人可能认为像这样的绑定会起作用:
Bind<User>().ToSelf();
Bind<User>().ToMethod(LoadCurrentUser).InRequestScope().Named("Current");
Run Code Online (Sandbox Code Playgroud)
当然,这给了:
Ninject.ActivationException: Error activating User More than one matching bindings are available. Activation path: 1) Request for User Suggestions: 1) Ensure that you have defined a binding for User only once.
我理解错误,因为命名绑定不限制该绑定的应用程序,因此两个绑定都适用.很明显,我需要使用.When*()方法的上下文绑定,但我无法想出任何方法来做到这一点.我觉得应该有什么方法可以检测是否应用了命名实例.就像是:
// Not valid Ninject syntax
Bind<User>().ToSelf().WhenUnnamedRequested();
Bind<User>().ToMethod(LoadCurrentUser).WhenNamedRequested().InRequestScope().Named("Current");
Run Code Online (Sandbox Code Playgroud)
我找不到IRequest界面上的任何地方或它的属性告诉我要求的名称.我该怎么做呢?
在过去,我使用swiftsuspenders作为动作脚本3 IoC控制器.基本上,switfsuspender的第一个版本与Ninject内核类似,称为注入器.
如果我想创建一个应用程序注入器(假设在整个应用程序中使用最相关的映射),我必须在应用程序类中注入注入器本身.
我想知道现在在应用程序的几个类中使用kernel.get <>的做法是什么.我应该注入内核吗?
我个人更喜欢使用kernel.inject但是如果我可以做kernel.inject我真的可能会手动注入依赖项,这可能更好(亲吻).
测试用例很好,但它们远非实际的实际问题,所以我希望你能帮助我澄清这一点.谢谢.
编辑:我注意到有些人谈论"根容器",似乎这是我正在寻找的概念.我应该如何设置根容器并让其他应用程序类知道它?
Edit2示例代码(请原谅错误,这只是为了示例):
class SomeClass
{
public SomeClass()
{
Command cmd = new Command();
cmd.execute();
}
}
class SomeOtherClass:ISomeOtherClass
{
public void allright()
{
//right
}
}
class Command
{
ISomeOtherClass dependency;
void execute()
{
dependency.allright();
}
}
Program.Main()
{
IKernel kernel = new StandardKernel();
kernel.Bind<SomeClass>().ToSelf().InSingletonScope();
kernel.Bind<ISomeOtherClass>().To<SomeOtherClass>();
SomeClass sc = kernel.Get<SomeClass>();
}
Run Code Online (Sandbox Code Playgroud)
我还没有对此进行测试,因为我仍然在解决一些初始化问题,但我的问题是,命令类如何知道SomeOtherClass?我目前的假设是在SomeClass中注入内核并使用Inject方法.
我在web应用程序后面使用memcache来最小化对SQL数据库的命中.我通过标记它们将C#对象存储到此缓存中SerializableAttribute.我们在应用程序中通过Ninject大量使用依赖注入.
其中一些对象很大,我想将它们分解.但是,它们来自单个存储过程调用(即一个存储过程调用被填充到完整的对象图中),并且我希望能够将这些对象分解并从缓存中单独延迟加载特定的子图而不是将整个对象图一次加载到内存中.
什么样的模式可以帮助我实现这一目标?
这是我的问题:每次我从内核请求一个实例时,我想将其中一个值传递给构造函数.我在下面写了一些代码来说明问题.测试没有失败,所以我猜这有效,但看起来确实很难看.使用Ninject有更好,更清洁的方法吗?或者我应该重新考虑我的设计?所有建议表示赞赏.
[TestFixture]
public class Sandbox
{
[Test]
public void Run_Forrest_Run()
{
using (var kernel = new StandardKernel(new Module()))
{
var connection = new Connection(Guid.NewGuid().ToString());
var downloader = kernel.Get<IDownloader>(new IParameter[] { new Parameter("connection", connection, false) });
Assert.That(downloader.Connection.Info, Is.EqualTo(connection.Info));
}
}
public class Downloader : IDownloader
{
public Downloader(Connection connection, ILogger logger)
{
Connection = connection;
Logger = logger;
}
public Connection Connection { get; private set; }
public void Download()
{
Logger.Log("Downloading...");
}
public ILogger Logger { get; private set; } …Run Code Online (Sandbox Code Playgroud) 在Ninject 1.0中,我有以下绑定定义:
Bind<ITarget>().To<Target1>().Only(When.Context.Variable("variable").EqualTo(true));
Bind<ITarget>().To<Target2>();
Run Code Online (Sandbox Code Playgroud)
鉴于我有这样的绑定:
ITarget target = kernel.Get<ITarget>(With.Parameters.ContextVariable("variable", true));
ITarget target = kernel.Get<ITarget>(With.Parameters.ContextVariable("variable", false));
Run Code Online (Sandbox Code Playgroud)
第一个调用被解析为Target1的实例,第二个调用被解析为Target2的实例.
如何将其翻译成Ninject 2.0?
parameters ninject conditional-binding contextual-binding ninject-2
我在dimecasts.net上观看了Ninject的前2个初学者教程.现在,我想在ASP.NET MVC 3中使用Ninject 2.2.我想要一个带有模拟模型的视图.在调用我的服务时,我没有将对象引用设置为对象的实例;
public class HomeController : Controller
{
private readonly IMilestoneService _service;
public HomeController()
{
}
HomeController(IMilestoneService service)
{
_service = service;
}
public ActionResult Index()
{
ViewBag.Message = "Change Request System";
return View();
}
public ActionResult About()
{
return View();
}
#region Partial views
public ActionResult Milestone()
{
var result = _service.GetMileStones();//OBJECT REF ERROR
return View(result);
}
#endregion
}
//####GLOBAL.ASAX
//By using the NinjectHttpApplication, it automatically takes care of controllers, starting up mvc, etc.
//Ninject.Web.Mvc …Run Code Online (Sandbox Code Playgroud) 我有一段代码Parallel.Foreach在要处理的项目列表上运行.每次迭代都会创建一些对象,每个对象都会实例化并处理它自己的Ninject IKernel实例.当对象完成它的工作时,就会释放IKernel.
也就是说,这个代码在我的Windows 7,I7笔记本电脑上运行得非常好.但是,当我将其推送到运行Windows 2008的VPS时,我得到了这个例外.异常不会发生在同一个迭代中,有时会经历10次迭代并抛出异常,有时则会经历数百次异常.显然似乎是一个线程问题,但除了我的VPS之外,它不会发生.如果重要,那么它将在ASP.NET IIS中托管.
System.AggregateException: One or more errors occurred. --->
System.ArgumentOutOfRangeException: Index was out of range.
Must be non-negative and less than the size of the collection.
Parameter name: index
at System.Collections.Generic.List`1.RemoveAt(Int32 index)
at Ninject.KernelBase.Dispose(Boolean disposing)
Run Code Online (Sandbox Code Playgroud)
以下是代码片段:
//Code that creates and disposes the Ninject kernel
using(ninjectInstance = new NinjectInstance())
{
using (var unitOfWork = ninjectInstance.Kernel.Get<NinjectUnitOfWork>())
{
Init();
continueValidation = Validate(tran, ofr);
}
}
public class NinjectInstance : IDisposable
{
public IKernel Kernel { get; private …Run Code Online (Sandbox Code Playgroud) 我在使用Ninject的UnitTesting项目中使用Moq时遇到了麻烦.
首先谈谈我的解决方案.它包含几个项目(BussinesLogic,DAL,Infrastructure ...).我的目标是UnitTest我在BussinessLogic项目中使用的逻辑.该解决方案基本上是一个Windows服务,但我已经放入逻辑,所以它可以独立运行.我正在使用Ninject,我指定天气我想使用ProductionModule或TestingModule(Windows服务使用ProductionModule,控制台应用程序使用TestingModule)
我正在使用工厂模式在我的应用程序中需要时获取ninject内核.
我的TestingModule继承自NinjectModule,我在其中覆盖了Load()方法,并在那里进行绑定.例如:
Bind<IStorageManager>().To<StubStorageManager>();
我有StubStorageManager,但它是空的.它只包含IStorageManager中的方法声明.
我想做的是(用非专业术语):创建一个unitTest,我将在其中创建一个新的内核,指定TestingModule作为它的参数.然后我想创建一个模拟对象(比如IStorageManager的模拟)storageManagerMock.IStorageManager中的某些方法返回一个messageObject,所以我可能也需要模拟它,因为业务逻辑正在基于该messageObject做一些事情.所以我想以某种方式设置属性到该消息对象,然后在其上调用一些businessLogic方法,所以我可以看到逻辑是否正常工作.
我希望我没有太多复杂化.
请耐心等待,我对嘲弄和依赖注入完全陌生,但我愿意学习.
我使用的是asp.net mvc 3,ninject 2.0和ninject mvc 3插件.
我想知道如何将服务层添加到我的过滤器中(在这种情况下是授权过滤器?).
我喜欢做构造函数注入,所以这是可能的还是我必须注入属性?
谢谢
编辑
我有这个属性注入,但我的属性总是为空
[Inject]
public IAccountService AccountServiceHelper { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
// check if context is set
if (httpContext == null)
{
throw new ArgumentNullException("httpContext");
}
// check if user is authenticated
if (httpContext.User.Identity.IsAuthenticated == true)
{
// stuff here
return true;
}
return false;
}
/// <summary>
/// Application_Start
/// </summary>
protected void Application_Start()
{
// Hook our DI stuff when application starts
IKernel kernel …Run Code Online (Sandbox Code Playgroud) 嗨,我在启用自定义成员资格和角色提供程序时出现了一些问
在执行当前Web请求期间发生了未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
System.InvalidOperationException:找不到默认成员资格提供程序.
它指向我的mvc3.ninject kernel.Inject(Membership.Provider)
我在app_start中的MVC3.Ninject:
private static void RegisterServices(IKernel kernel)
{
kernel.Inject(Membership.Provider);
kernel.Inject(Roles.Provider);
kernel.Bind<IUnitOfWork>().To<EFContext>().InRequestScope();
kernel.Bind<IUzytkownicyRepository>().To<UzytkownicyRepository>().InRequestScope();
}
Run Code Online (Sandbox Code Playgroud)
我的角色提供者:
public class DziennikRoleProvider : RoleProvider
{
[Inject]
private IUzytkownicyRepository repository { get; set;}
Run Code Online (Sandbox Code Playgroud)
我的会员提供者:
public class DziennikMembershipProvider : MembershipProvider
{
[Inject]
private IUzytkownicyRepository repository { get; set; }
Run Code Online (Sandbox Code Playgroud)
我的WebConfig文件:
<membership defaultProvider="DziennikMembershipProvider">
<providers>
<clear/>
<add name="DziennikMembershipProvider" type="Dziennik_MVC.Helpers.DziennikMembershipProvider, Dziennik_MVC" connectionStringName="EFDbContext"
applicationName="/" />
</providers>
</membership>
<profile>
<providers>
<clear/>
</providers>
</profile>
<roleManager defaultProvider="DziennikRoleProvider" enabled="true" cacheRolesInCookie="true">
<providers>
<clear />
<add name="DziennikRoleProvider" type="Dziennik_MVC.Helpers.DziennikMembershipProvider, Dziennik_MVC" connectionStringName="EFDbContext" />
</providers>
</roleManager>
Run Code Online (Sandbox Code Playgroud) ninject-2 ×10
ninject ×5
c# ×3
.net ×2
asp.net ×1
asp.net-mvc ×1
c#-4.0 ×1
moq ×1
nunit ×1
parameters ×1
roleprovider ×1
unit-testing ×1