以下是需要创建对象的顺序。我想在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>();
到目前为止,我只能在那里中途,但无法弄清楚整个配置的完整程度。前三个对象是单例,只需要正确实例化和配置第四个对象。
答案 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>
并从那里开始操作。