【发布时间】:2020-12-29 16:11:50
【问题描述】:
我正在尝试为我维护的框架为 Lamar 构建一个包。 为了说明我引用 StructureMap 的意思,能够将运行时对象与 Service 抽象混合的相关方法是(将容器传递给该工厂类的构造函数):
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);
}
我意识到 Lamar 没有实现 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>();
});
我创建了一个示例项目,它重新创建了可以是downloaded here 的问题。它使用 .NET 5
在该项目中,如果您在 MainPresenter 类中设置断点,您将看到 IView 参数为 null 并且 OrdersService 确实解析。
我还需要传入作为主要表单的具体对象(作为IView)。
干杯
【问题讨论】:
-
我似乎已经用上面的代码来工作了。我犯的错误是我将注射剂注册为IView,而不是从IView继承的接口,即IMainView。所以,
c.Injectable<IMainView>(); -
我说得太早了。这不起作用。解析 IPresenter 时,IView 为空。我已经用我正在使用的注册码更新了答案。
-
请edit您的问题包含您拥有的完整源代码作为minimal reproducible example,其他人可以编译和测试。另请参阅:What Do You Mean “It Doesn't Work”?。 “BOOM !!!”到底是什么意思?你有例外吗?
-
@Progman 我添加了一个指向 zip 文件的链接,其中包含一个重新创建问题的示例项目。我最初遇到了一个例外,当我发布问题时忘记删除对 BOOM 的引用。谢谢。
-
不要在外部站点上添加源代码,将 MCVE 添加到问题本身。