我试图让IoC的概念来与WinForms应用程序。 说我有一个演示其构造函数采用其观点和构造函数的参数的服务。 所以在形式的代码,我有一些达这样的:
mnPresenter = new Presenter(this, new AppService());
在那里,说是AppService服务的IAppService的实现。 它注册在我的[autofac]
IoC容器。 是什么让“新”出这个主持人建设的建议呢? 没有使用IoC框架就像我上面做失去这些“新”的呼叫整点?
我可以做类似
mPresenter = new Presenter(this, MyContainer.Resolve<IAppService>())
但似乎打败的IoC的目的。 我可能丢失的东西在这里根本。
提前道歉,如果我失去了一些东西明显。
你的问题是,有观点和演示之间的依赖关系循环,因为他们彼此依赖。 打破这种依赖循环的一般规则是退却到财产注入,这会在你的情况下正常工作。
随着MVP,最好是让视图通过将其注入演示的属性分配自己创建的演示:
mPresenter = container.Resolve<Presenter>();
mPresenter.View = this;
如果可以的话,隐藏应用程序的容器。 由于您使用的MVP,只是你永远需要直接解决的事情是主持人。 因此,与其让形式与集装箱沟通,让他们有一个静态的沟通PresenterFactory
。 该工厂将使用容器盖下:
mPresenter = PresenterFactory.Create<MyPresenter>();
mPresenter.View = this;
你PresenterFactory
可能是这样的:
public static class PresenterFactory
{
private static IContainer container;
public static TPresenter Create<TPresenter>()
where TPresenter : IPresenter
{
return (TPresenter)
container.Resolve(typeof(TPresenter));
}
public static void SetContainer(IContainer container)
{
PresenterFactory.container = container;
}
}
和你的作文根可能是这样的:
static void Main()
{
Bootstrap();
}
private static void Bootstrap()
{
var builder = new ContainerBuilder();
// TODO: register presenters
var container = builder.Build();
PresenterFactory.SetContainer(container);
}
UPDATE
或许更重要的它是做这样的事情:
interface IPresenter<TView>
{
TView View { get; set; }
}
public static class PresenterFactory
{
private static IContainer container;
public static IPresenter<TView> CreateForView<TView>(TView view)
{
var presenter = container.Resolve<IPresenter<TView>>();
presenter.View = view;
return presenter;
}
}
// View
mPresenter = PresenterFactory.CreateForView(this);
这隐藏实际执行从视图中呈现的和集中的视图到演讲者的注册。
你需要的属性在主持人
public IAppService service;
它将由容器注入,你并不需要把它作为参数传递。 你所写的是一个服务定位器,实际上是一种反模式为510C。
如果您的看法是强类型并与容器注册过,你可以使用Autofac和财产.SingleInstance生命周期
public IMyView view;
在您的介绍,容器会再注入视图实例到您的主持人。
你基本上看代码另一个问题: 注册一个演示了查看