帮助进行结构图配置

时间:2011-05-16 08:20:28

标签: asp.net-mvc-3 configuration structuremap

我正在尝试将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的最佳方法是什么?

1 个答案:

答案 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来删除重复的代码,并尽量减少添加新存储库的工作量。