StructureMap和链接类的参数?

时间:2012-07-05 05:35:27

标签: structuremap

以下是需要创建对象的顺序。我想在SM中初始化整个事情,只使用最后一个作为目标:

var firstObject = new FirstClass("First", "Last");
var servers = new List<FirstClass> { firstObject };
var secondObject = new SecondClass();
secondObject.Servers = servers;
var thirdObject = new ThirdClass(secondObject);
var fourthObject = thirdObject.SomeGetFunction(thirdObject);

在SM中配置完毕后,我基本上只使用

var objectToUse = ObjectFactory.GetInstance<fourthObject>();

到目前为止,我只能在那里中途,但无法弄清楚整个配置的完整程度。前三个对象是单例,只需要正确实例化和配置第四个对象。

1 个答案:

答案 0 :(得分:0)

以下是如何实现这一目标的。我不确定这是否符合最佳实践,但能完成工作。

要创建的第一个对象需要配置文件中的一些设置;这很容易。

For<FirstClass>()
     .Singleton()
     .Use<FirstClass>()
     .Ctor<string>("First").EqualToAppSetting("FirstKey")
     .Ctor<string>("Last").EqualToAppSetting("LastKey");

第二个更有问题,因为在创建之后需要设置两个属性,其中一个属于IEnumerable<FirstClass>类型,我无法弄清楚如何设置。事实证明,SM的“上下文”对象和拦截就是答案。

For<SecondClass>()
     .Singleton()
     .Use<SecondClass>()
     .OnCreationForAll((context,x) => 
                           {
                               var server = new FirstClass[1];
                               server[0] = context.GetInstance<FirstClass>();
                               x.Servers = server;
                               x.Connections = 1;
                           });

第三个也很容易,我们可以让SM找出依赖关系。

For<ThirdClass>().Singleton().Use<ThirdClass>();

第四个也是最后一个很棘手,因为我之后的对象应该是通过调用ThirdClass创建的。再次,建立“上下文”证明在这里很有用。

For<FourthClass>()
      .Singleton()
      .Use(context => context.GetInstance<ThirdClass>().SomeGetFunction("stringParam"));

现在我所要做的就是致电ObjectFactory.GetInstance<FourthClass>并从那里开始操作。