Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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# 如何将StructureMap与通用的未关闭类型一起使用,使用带“a”的扫描;贪婪的;建造师_C#_Asp.net Mvc_Generics_Dependency Injection_Structuremap - Fatal编程技术网

C# 如何将StructureMap与通用的未关闭类型一起使用,使用带“a”的扫描;贪婪的;建造师

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

在各种堆栈溢出问题和博客文章之间,有相当数量的关于开放泛型和StructureMap主题的文档。不幸的是,我肯定错过了一些东西,因为我尝试使用
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和泛型的一些相关堆栈溢出问题
关于StructureMap和泛型的博客文章

是否有IToCsvService的具体实现?还是仅仅是开放式服务

ConnectionImplementationsToTypesClosing用于将具体的CustomServiceWModelToCsvService连接到IToCsvService。如果要将开放类连接到开放接口,则需要:

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>>();