让我们讨论一件事: 我有一些简单的界面:
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>()
一个好的做法(现在我现在还没有其他解决方法)?
答案 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(); });
将使用默认实现映射您的接口。