C# 如何将StructureMap与通用的未关闭类型一起使用,使用带“a”的扫描;贪婪的;建造师
在各种堆栈溢出问题和博客文章之间,有相当数量的关于开放泛型和StructureMap主题的文档。不幸的是,我肯定错过了一些东西,因为我尝试使用C# 如何将StructureMap与通用的未关闭类型一起使用,使用带“a”的扫描;贪婪的;建造师,c#,asp.net-mvc,generics,dependency-injection,structuremap,C#,Asp.net Mvc,Generics,Dependency Injection,Structuremap,在各种堆栈溢出问题和博客文章之间,有相当数量的关于开放泛型和StructureMap主题的文档。不幸的是,我肯定错过了一些东西,因为我尝试使用scan来执行配置以及具有“贪婪”构造函数的类实现还没有成功 我希望StructureMap通过对其实现接口的引用来获取下面类的实例ToCsvService存在于名为Infrastructure的未引用程序集中IToCsvService存在于名为Core的引用程序集中。如你所见 ToCsvService有一个“贪婪”构造函数 public class To
scan
来执行配置以及具有“贪婪”构造函数的类实现还没有成功
我希望StructureMap通过对其实现接口的引用来获取下面类的实例ToCsvService
存在于名为Infrastructure的未引用程序集中<代码>IToCsvService存在于名为Core的引用程序集中。如你所见
ToCsvService
有一个“贪婪”构造函数
public class ToCsvService<TSource> : IToCsvService<TSource>
{
public ToCsvService(ICollection<TSource> collection)
{
}
}
在ObjectFactory.WhatDoIHave()
方法中,StructureMap似乎知道ToCsvService
PluginType Name Description
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
IToCsvService`1 (IToCsvService`1)
Scoped as: Transient
6202a7ee-89a4-4edd-831d-4867b7dd1a7e Configured Instance of Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null Configured Instance of Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
使用上述命令后,将从ObjectFactory.WhatDoIHave()
中转储
PluginType Name Description
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
IToCsvService`1 (IToCsvService`1) Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null Configured Instance of Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Scoped as: Transient
Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null Configured Instance of Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
IToCsvService`1 (IToCsvService`1) Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null Configured Instance of Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Scoped as: Transient
Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null Configured Instance of Infrastructure.Services.ToCsvService`1, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
插件类型名称描述
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
IToCsvService`1(IToCsvService`1)Infrastructure.Services.ToCsvService`1,Infrastructure,版本=1.0.0,区域性=中立,PublicKeyToken=null配置的基础设施实例。Services.ToCsvService`1,Infrastructure,版本=1.0.0,区域性=中立,PublicKeyToken=null
范围为:瞬态
Infrastructure.Services.ToCsvService`1,Infrastructure,Version=1.0.0,Culture=neutral,PublicKeyToken=null配置的Infrastructure.Services.ToCsvService`1,Infrastructure,Version=1.0.0,Culture=neutral,PublicKeyToken=null
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
IToCsvService`1(IToCsvService`1)Infrastructure.Services.ToCsvService`1,Infrastructure,版本=1.0.0,区域性=中立,PublicKeyToken=null配置的基础设施实例。Services.ToCsvService`1,Infrastructure,版本=1.0.0,区域性=中立,PublicKeyToken=null
范围为:瞬态
Infrastructure.Services.ToCsvService`1,Infrastructure,Version=1.0.0,Culture=neutral,PublicKeyToken=null配置的Infrastructure.Services.ToCsvService`1,Infrastructure,Version=1.0.0,Culture=neutral,PublicKeyToken=null
通过此配置,我引发了以下异常:
StructureMap异常代码:202
没有为PluginFamily System.Collections.Generic.ICollection`1[[UI.Models.MachineForm,UI,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null]]定义默认实例,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089
对我来说,异常表明StructureMap知道它需要一个ICollection
来实例化ToCsvService
,但不知道从哪里获取它。下面是关于使用StructureMap和的注释。但是,如果不添加对基础结构程序集的显式引用,这似乎是不可能的
关于StructureMap和泛型的一些相关堆栈溢出问题
For(typeof(IToCsvService<>)).Use(typeof(ToCsvService<>));
For(typeof(IToCsvService))。使用(typeof(tocsvsservice));
这里我将开放接口类型连接到开放类类型。实际上,在当前版本中,它应该非常简单。您所要做的就是在调用以获取对象的新实例时提供参数。为此,请在objectfactory上使用“With”方法 这允许您使用贪婪构造函数。但是,这也意味着您必须知道,在本例中,您需要集合。因此,它不是注入状态的最佳方法
var newObject = ObjectFactory.With<ICollection<CustomerViewModel>>(SomeCollection)
.GetInstance<IToCsvService<CustomerViewModel>>();
var newObject=ObjectFactory.With(SomeCollection)
.GetInstance();
这很有道理,但这不需要引用包含ToCsvService
的程序集吗?啊,刚才看到了。程序集最终会被加载,不是吗?最终,您必须加载该类型。此时,您可以使用容器的Configure方法。请记住,这用于。仅需要类型对象的实例。对于动态加载的程序集,有很多方法可以获取这些信息。基于ObjectFactory.WhatDoIHave()
的转储,我认为正在加载ToCsvService
。假设ToCsvService
已成功加载到StructureMap中,我会在Configure方法中指定什么来允许它使用“贪婪”构造函数生成IToCsvServiceFor(typeof(IToCsvService<>)).Use(typeof(ToCsvService<>));
var newObject = ObjectFactory.With<ICollection<CustomerViewModel>>(SomeCollection)
.GetInstance<IToCsvService<CustomerViewModel>>();