我正在尝试将Structuremap配置为类似以下内容,但我似乎能够做到这一点
ObjectFactory.Initialize(x => {
x.For<TunaRepository>()
.Use(new TunaRepository(serviceEndpoint))
.Named("Tuna");
x.For<CodRepository>()
.Use(new CodRepository(serviceEndpoint))
.Named("Cod");
x.For<HaddockRepository>()
.Use(new HaddockRepository(serviceEndpoint))
.Named("Haddock");
x.For<IFishRepository>().AddInstances(y =>
{
y.OfConcreteType<TunaRepository>().
// Somehow add all instances here???
});
x.For<TunaController>().Use<TunaController>()
.Ctor<IFishRepository>("repo").Is<TunaRepository>(); // This Is should use the instance registered above
x.For<CodController>().Use<CodController>()
.Ctor<IFishRepository>("repo").???
x.For<HaddockController>().Use<HaddockController>()
.Ctor<IFishRepository>("repo").???
});
在我的代码中我希望能够做到:
var instances = ObjectFactory.GetAllInstances<IFishRepository>();
还有:
var instance = ObjectFactory.GetNamedInstance<IFishRepository>("Cod");
并且还使用IFishRepository作为我的控制器的争论:
public TunaController(IFishRepository repo ...
所以我的问题是配置我的ObjectFactory的最佳方法是什么?
答案 0 :(得分:0)
注册不应该是Default实例的命名实例时,请使用Add方法:
x.For<IFishRepository>()
.Add(() => new TunaRepository(serviceEndpoint))
.Named("Tuna");
另请注意,除非您希望TunaRepository是Singleton,否则您应该使用lambda注册它。在请求实例时将评估lambda,并且在我的示例中将返回一个新实例。注意serviceEndpoint,并确保是否需要所有存储库的单个实例。通常我倾向于使用For&lt;&gt;()连接所有依赖项。在结构图中尽可能使用&lt;&gt;()而不是使用“new”。这样做可以使架构更加灵活,特别是因为您可以在不更改注册的情况下向ctors添加新参数。
要指定要在构造函数中使用的命名实例,可以使用以下语法:
x.For<TunaController>().Use<TunaController>().
Ctor<IFishRepository>("repo").
Is(i => i.TheInstanceNamed("Tuna"));
由于您的所有注册都遵循相同的模式,因此我会使用IRegistrationConvention来删除重复的代码,并尽量减少添加新存储库的工作量。