我正在尝试为我维护的框架为 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);
}
我意识到 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!!!
}
Lamar 有替代方法吗?
这是我的注册码:
IContainer container = new Container(c =>
{
c.AddTransient<ISomeService, SomeService>();
c.Injectable<IMainView>();
c.AddTransient<MainPresenter>();
});
我创建了一个示例项目,它重现了可能是 downloaded here 的问题.它使用.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
文件可用
https://stackoverflow.com/questions/65263332/
相关文章:
ansible - 我怎样才能访问另一台服务器的ansible facts?
typescript - 是否可以修改 TypeScript 中文字的推断类型?
docker - Docker 中 dotnet/aspnet :3. 1 的 list 条目中没有
macos - M1 MAC 的 opencv 问题 - OpenCV imshow 不起作用
docker - 如何在 VSCode devcontainer 中使用 minikube?
c# - EFCore5,使用 FromSqlRaw 和 [Owned] 属性