【发布时间】:2013-04-12 18:37:45
【问题描述】:
我需要一个工厂类做一些工作才能返回一个实例,所以我有一个这样的工厂方法:
public Foo Create(string bar, IEnumerable<SomeMetaData> metaData)
{
var meta = new ObservableCollection<AnotherType>(
metaData.Select(e => new AnotherType { ... }).ToList());
return Create(new ConstructorArgument("bar", bar),
new ConstructorArgument("metaData", meta));
}
具体工厂类派生自一个基础工厂,它省去了我的实际接线,以防你想知道IResolutionRoot 去了哪里:
public abstract class FactoryBase<T> where T : class
{
private IResolutionRoot _resolutionRoot;
protected FactoryBase(IResolutionRoot resolutionRoot)
{
_resolutionRoot = resolutionRoot;
}
protected T Create(params IParameter[] parameters)
{
return _resolutionRoot.Get<T>(parameters);
}
}
(如果有人想评论这个抽象类,我在 CodeReview 上有一个问题:https://codereview.stackexchange.com/questions/25038/are-there-side-effects-to-having-a-generic-ninject-factory)
问题是在 NinjectModule 中,我不知道如何告诉 Ninject 使用特定的具体 FooFactory 类:
Bind<IFooFactory>().ToFactory(); // uses an abstract factory that doesn't do what I need
Bind<IFooFactory>().ToFactory<FooFactory>(); // doesn't build
我相信我需要的是这样的:
Bind<IFooFactory>().ToFactory<FooFactory>(Func<FooFactoryInstanceProvider>);
我需要做什么才能提供这个InstanceProvider?
可能只是我对Func<T> 的误解,但我发现http://www.planetgeek.ch/2011/12/31/ninject-extensions-factory-introduction/ 对此过于模糊。
我想出了这个:
public class FooFactoryInstanceProvider : StandardInstanceProvider
{
protected override Type GetType(MethodInfo methodInfo, object[] arguments)
{
return typeof(FooFactory);
}
}
到目前为止这么好?下一步是什么?
【问题讨论】:
-
另外我觉得这篇文章的答案不被接受:stackoverflow.com/questions/11207681/… 在这里做正确的事情 - 我不想要
.InSingletonScope... 还是我想要? -
顺便说一句,几乎所有 Remo 的帖子(例如您引用的帖子)都变成了 wiki 文章并从那里得到更新和改进 - 值得尝试找到等效的文章以防万一它有更新
-
@RubenBartelink 谢谢,很高兴知道 - 现在我在我最喜欢的 Chrome 栏中有 github.com/ninject/ninject/wiki 和 github.com/ninject/ninject.extensions.factory/wiki,有些东西告诉我他们会留下来!
-
不要害怕编辑它们或添加示例 - 每一个小改进都会帮助某人......