最佳实践:调用GetInstance方法来实例化对象

时间:2010-08-09 19:32:22

标签: dependency-injection structuremap

让我们讨论一件事: 我有一些简单的界面:

public interface ICar
{
    void StartEngine();
    void StopEngine();
}

public interface IRadio
{
    //doesn't matter
}

和一些实施:

public class SportCar : ICar
{
  private IRadio radio;
  public SportCar(IRadio radioObj)
  {
    radio = radioObj;
  }
  //all the rest goes here    
}

我们还有StructureMap初始化代码,我们在程序初始化时调用它:

private void InitializeStructureMap()
{
  ObjectFactory.Initialize(x=>
  {
     x.For<ICar>.Use<SportCar>();
     x.For<IRadio>.Use<CarAudioSystem>();
  });
 }

我的问题是:实例化SportCar的最佳做法是什么?正在打电话:

ObjectFactory.GetInstance<ICar>() 

一个好的做法(现在我现在还没有其他解决方法)?

1 个答案:

答案 0 :(得分:3)

ObjectFactory.GetInstance是您的起点,也就是您用来解决层次结构中第一个对象的问题。

这就是我启动WinForms应用程序的方法,同样的技术应该适用于WebForms,Windows服务和控制台应用程序:

 var main = ObjectFactory.GetInstance<Main>();
 Application.Run(main);

对于ASP.NET MVC,框架允许您注册创建控制器的工厂,但即使在该工厂中,您也可以调用ObjectFactory.GetInstance来实现控制器。

作为旁注: 当你进行初始化时,你没有明确需要将ICar映射到SportCar,除非你有多个ICar实现,你可以这样做

x.Scan(a => { a.TheCallingAssembly(); a.WithDefaultConventions(); });

将使用默认实现映射您的接口。