我有4个项目:
核心(IServer):
DependencyResolver:
基础设施(服务):
控制台:
Requierements:
我正在尝试仅在DependencyResolver中使用StructureMap。 此外,控制台应用程序不应该了解有关Infrastucture的任何信息。
当我不想在我的控制台应用程序上引用StructureMap时,我必须构建一个ServiceLocator。
在DependencyResolver中我有一个Bootstrapper负责调用StructureMap注册表内容(注册)
在我的控制台应用程序中,我想获得一个实例。为此,我需要引用StructureMap。另一种方法是在StructureMaps解析方法周围编写一个小包装器。
还有其他更好的方法可以将控制台与StructureMap分离吗?
答案 0 :(得分:17)
虽然我看到了分离IoC寄存器,解析,从应用程序的实现中释放的原因,但我没有看到为什么IoC容器不应该在控制台应用程序(组合根)和应用程序中的任何原因而是在另一个程序集中实现。
这样控制台应用程序非常简单:
使用SM看起来像这样:
public void Main(params string[] args)
{
using (var container = new Container())
{
container.LoadAllConfigurationModules();
container.AddRegistry<SomeRegistry>();
container.GetInstance<Application>().Run(args);
}
}
对于启动时无法创建的内容,您可以在应用程序集中创建工厂界面:
interface ISomeFactory { ISomeDependency CreateSomeDependency() }
并通过注入容器并使用它来解析实例,在控制台应用程序中实现此接口。我想SM实现看起来像这样:
public class SomeFactory : ISomeFactory
{
public SomeFactory(IContainer sontainer) { this.container = container; }
ISomeDependency CreateSomeDependency() { this.container.GetInstance<ISomeDependency>(); }
}
其他IoC容器甚至具有自动实现这些接口工厂的功能。