我正在为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)
参数数据类型要求viewInstance
与c.Injectable<IMainView>();
使用的类型相同
我得到了OrdersService.GetOrders
异常,因为没有可用的orders.zip
文件