C# 使用Lamar注入运行时对象
我正试图为我维护的框架构建一个Lamar包。 为了说明我引用StructureMap的意思,能够将运行时对象与服务抽象混合在一起的相关方法是(容器被传递到这个工厂类的构造函数中): 我意识到Lamar没有实现C# 使用Lamar注入运行时对象,c#,lamar,C#,Lamar,我正试图为我维护的框架构建一个Lamar包。 为了说明我引用StructureMap的意思,能够将运行时对象与服务抽象混合在一起的相关方法是(容器被传递到这个工厂类的构造函数中): 我意识到Lamar没有实现明确的目标(很公平) 我使用了可注入功能,但无法使其发挥作用: public IPresenter Create(Type presenterType, Type viewType, IView viewInstance) { var c = _container.GetNested
明确的目标
(很公平)
我使用了可注入功能,但无法使其发挥作用:
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>();
});
IContainer容器=新容器(c=>
{
c、 AddTransient();
c、 可注射();
c、 AddTransient();
});
我已经创建了一个示例项目,它重新创建了一个问题,这个问题可能会被忽略。它使用.NET5
在该项目中,如果您在类MainPresenter
中放置断点,您将看到IView
参数为null,并且OrdersService
确实解析
我还需要传入作为主要形式的具体对象(以及IView
)
干杯LamarPresenterFactory出现问题。创建方法视图实例参数
publicIPresenter创建(类型presenterType、类型viewType、iviewviewInstance)
{
}
我注意到它应该是IMainView
类型,如下所示
publicIPresenter创建(类型presenterType、类型viewType、IMainView viewInstance)
{
var nestedContainer=_container.GetNestedContainer();
nestedContainer.Inject(viewInstance);
返回nestedContainer.GetInstance(presenterType)作为IPresenter;
}
nestedContainer.Inject(viewInstance)
参数数据类型要求viewInstance
与c.Injectable()使用的类型相同代码>
我得到了OrdersService.GetOrders
异常,因为没有可用的orders.zip
文件我似乎用上面的代码得到了这个。我犯的错误是,我将可注入注册为IView,而不是从IView继承的接口,即IMainView。所以,c.Injectable()我说得太快了。这是行不通的。解析IPresenter时,IView为null。我已经用我正在使用的注册码更新了答案。请将您的问题包含完整的源代码,这些代码可以由其他人编译和测试。另请参见:。你说的“轰!!!”到底是什么意思?你有例外吗?@Progman我添加了一个指向zip文件的链接,其中包含一个示例项目,该项目重新创建了该问题。起初我遇到了一个例外,当我发布这个问题时,我忘了删除对BOOM的引用。谢谢。不要在外部站点上添加源代码,请将MCVE添加到问题本身。IMainView
inheritsIView
。不幸的是,该参数必须是IView,否则我们必须为每个演示者编写一个Create方法。Create方法来自一个通用接口,所有受支持的DI容器都实现了这个接口(到目前为止只有2个)。我最初尝试注册c.Injectable()
,但调用GetInstance
@OneFoots时会引发异常,因为您向IMainView
声明要注入,但没有什么要得到IView
实例注入。这可能会导致Create
将获取IView
参数实例(不是IMainView
),您认为容器将如何将IView
注入presenterType
而不是IMainView
?您可以将容器配置为c.Injectable()代码>允许将IView
实例注入presenterType构造函数。看起来Lamar还没有我想要的功能。如果你看我文章的顶部,可以看到StructureMap。ExplicitArguments
就在那里配置,然后在Create
方法中配置。我还用SimpleInjector
和Autofac
实现了它,它们都有不同但有效的实现方法。没什么大不了的。我将尽可能多地支持IOC框架。如果拉马尔将来支持它,我会增加支持。如果现在是这样,有人可以告诉我怎么做,同样。拉马尔看起来很棒,如果可以的话,我一定会支持的。干杯
IContainer container = new Container(c =>
{
c.AddTransient<ISomeService, SomeService>();
c.Injectable<IMainView>();
c.AddTransient<MainPresenter>();
});