2013-03-07 62 views
0

是否有人知道在调用构造函数之前注入属性的IoC容器?是否有.net IoC可以在调用对象构造函数之前注入属性?

我正在处理内部框架,我不想强​​迫人们从具有多个参数的构造函数派生使用我的基类(它是繁琐的东西,如调度等等,如果我添加更多的基础那么更新每个使用该基地的代码将是一项巨大的工作)。如果在用户构造函数被调用之前设置了它们,那么这样会更好,这样我就不必有一个单独的OnInitialised虚拟方法,它们可以完成依赖于这些属性的初始化。

编辑

为了澄清,我正在想这里是财产注射等同于在建筑领域链initialisers。

  1. 派生静态字段
  2. 衍生静态构造函数
  3. Derived实例字段
  4. 基地静态字段
  5. 基地静态构造函数
  6. 基础实例字段
  7. 基地实例构造
  8. Derived实例构造函数

即大约6.5或也许7.5(虽然这将是一个有点怪)

+0

目前还不清楚是什么,你甚至是说......你怎么可以设置属性您已经创建了一个对象之前? – 2013-03-07 19:56:01

+0

我在想,通过使用GetUninitializedObject()创建对象,然后注入属性,然后调用构造函数。类似于在C++中放置新类型的东西。 – DanH 2013-03-07 19:58:49

+1

我真的很希望不能这样做。它违背了一切正常的.NET编码。你将如何测试代码呢? – 2013-03-07 19:59:46

回答

0

按照对问题的意见,这是一个似乎满足我的需要的模式,但我将需要使用TLS避免在这个例子中的服务定位器(我需要以这种方式控制属性的范围)。

public class TestBase 
{ 
    private SchedulerContext schedulerContext = InitScheduler(); 
    public SchedulerContext SchedulerContext 
    { 
     get { return this.schedulerContext; } 
    } 

    private static SchedulerContext InitScheduler() 
    { 
     return ServiceLocator.Current.GetInstance<SchedulerContext>(); 
    } 

    public TestBase() 
    { 
     Console.WriteLine("Is Instantiated: {0}", this.SchedulerContext != null);   
    } 
} 

public class TestDerived : TestBase 
{ 
    public TestDerived() 
    { 
     Console.WriteLine("Is Instantiated: {0}", this.SchedulerContext != null); 
    } 
} 

但这至少避免分解语言的恐怖对象构造框架:)

相关问题