Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Lamar注入运行时对象_C#_Lamar - Fatal编程技术网

C# 使用Lamar注入运行时对象

C# 使用Lamar注入运行时对象,c#,lamar,C#,Lamar,我正试图为我维护的框架构建一个Lamar包。 为了说明我引用StructureMap的意思,能够将运行时对象与服务抽象混合在一起的相关方法是(容器被传递到这个工厂类的构造函数中): 我意识到Lamar没有实现明确的目标(很公平) 我使用了可注入功能,但无法使其发挥作用: public IPresenter Create(Type presenterType, Type viewType, IView viewInstance) { var c = _container.GetNested

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

我意识到Lamar没有实现
明确的目标
(很公平)

我使用了可注入功能,但无法使其发挥作用:

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()IMainView
inherits
IView
。不幸的是,该参数必须是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>();
});