使用Lamar注入运行时对象



我正在为Lamar构建一个我维护的框架包。为了说明我引用StructureMap的意思,能够将运行时对象与服务抽象混合在一起的相关方法是(容器被传递给这个工厂类的构造函数(:

public IPresenter Create(Type presenterType, Type viewType, IView viewInstance)
{
container.Configure(x => x.For(presenterType)
.Use(presenterType)
.Named(presenterType.Name)
);
var args = new ExplicitArguments();
args.Set("view");
args.SetArg("view", viewInstance);
return (IPresenter)container.GetInstance(presenterType, args);
}

我意识到拉马尔没有实现ExplicitArguments(足够公平(。

我试着使用Injectable功能,但没能让它发挥作用:

public IPresenter Create(Type presenterType, Type viewType, IView viewInstance)
{
var c = _container.GetNestedContainer();
c.Inject(viewInstance);
// return c.GetInstance(presenterType, presenterType.Name.ToString()) as IPresenter; // BOOM!!!
return _container.GetInstance(presenterType) as IPresenter; // BOOM!!!
}

拉马尔还有别的办法吗?

这是我的注册码:

IContainer container = new Container(c =>
{
c.AddTransient<ISomeService, SomeService>();
c.Injectable<IMainView>();
c.AddTransient<MainPresenter>();
});    

我已经创建了一个示例项目,可以在这里下载该项目来重现问题。它使用.NET 5

在该项目中,如果在类MainPresenter中放置一个断点,您将看到IView参数为null,并且OrdersService确实解析了。

我需要那个具体的对象,它是主要的形式,也要传入(作为IView(。

干杯

LamarPresenterFactory.Create方法viewInstance参数有问题

public IPresenter Create(Type presenterType, Type viewType, IView viewInstance)
{
}

我注意到它应该是IMainView类型,就像下面的一样

public IPresenter Create(Type presenterType, Type viewType, IMainView viewInstance)
{
var nestedContainer = _container.GetNestedContainer();
nestedContainer.Inject(viewInstance);
return nestedContainer.GetInstance(presenterType) as IPresenter;
}

nestedContainer.Inject(viewInstance)参数数据类型要求viewInstancec.Injectable<IMainView>();使用的类型相同

我得到了OrdersService.GetOrders异常,因为没有可用的orders.zip文件

相关内容

  • 没有找到相关文章

最新更新