我正在尝试使用注入属性ninject.考虑到ninject下面模块中的两个绑定,我希望将ConcreteDependency其注入B.
但是,似乎WhenInjectedInto不考虑注入的类型,只考虑目标的声明类型(在这种情况下为属性).
有没有办法实现我预期的行为?
static void Main(string[] args)
{
var kernel = new StandardKernel(new TestModule());
var b = kernel.Get<B>();
var c = kernel.Get<C>();
}
class TestModule : NinjectModule
{
public override void Load()
{
Bind<IDependency>().To<EmptyDependency>();
Bind<IDependency>().To<ConcreteDependency>().WhenInjectedInto<B>();
}
}
abstract class A
{
[Inject]
public IDependency Dependency { get; set; }
}
class B : A {}
class C : A {}
interface IDependency {}
class EmptyDependency : IDependency { }
class …Run Code Online (Sandbox Code Playgroud) 我一直在编写一些自定义 WinForm 控件,这些控件执行大量绘图,因此往往有大量基于一次性图形的字段(画笔、笔、位图等),因此我的控件的 Dispose()方法必须对每个方法调用 Dispose。
我担心我(或未来的维护者)很容易错过需要处理的字段,要么忘记处理它,要么没有意识到它实现了 IDisposable。因此,我在 Object 上编写了一个非常简单的扩展方法,它查找所有 IDisposable 字段并处理它们:
static public void DisposeAll(this Object obj)
{
var disposable = obj.GetType()
.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)
.Select(fi => fi.GetValue(obj))
.Where(o => o != null && o is IDisposable)
.Cast<IDisposable>();
foreach (var d in disposable) d.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
我的问题基本上是这是否合理。我想不出它可能会搞砸什么,但是我对 WinForms 的内部工作原理并不是特别熟悉,这似乎是一种可能会导致令人恼火的错误的事情(扰乱反射和处置)。