Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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# autofac:如何解析命名类型的集合?_C#_Autofac - Fatal编程技术网

C# autofac:如何解析命名类型的集合?

C# autofac:如何解析命名类型的集合?,c#,autofac,C#,Autofac,我在容器中注册了大量TaskParameters类实例,如: builder.Register(c => [some type instantiation] )).Named<TaskParameters>("someTask").InstancePerDependency(); builder.Register(c => [some type instantiation] )).Named<TaskParameters>("someOthe

我在容器中注册了大量TaskParameters类实例,如:

builder.Register(c => [some type instantiation]
    )).Named<TaskParameters>("someTask").InstancePerDependency();

builder.Register(c => [some type instantiation]
    )).Named<TaskParameters>("someOtherTask").InstancePerDependency();
builder.Register(c=>[某些类型实例化]
)).Named(“someTask”).InstancePerDependency();
注册器(c=>[某些类型实例化]
)).Named(“someOtherTask”).InstancePerDependence();
这些类可以在应用程序的任何模块中注册。我想获得可用命名实例的列表,将其发送给客户机,客户机应按名称实例化并执行它

是否有一个选项可以获取名称列表,而不实际实例化类型?
目前,我正在挖掘IComponentContext的ComponentRegistry,我从,
var ctx=Container.Resolve()获取它,我的方向正确吗?

如果服务的名称对您的应用程序很重要,可能应该将其建模到您的代码中。例如,您有
TaskParameters
;也许你想要这样的东西:

public class Descriptor<T>
{
    private readonly string _description;
    private readonly Func<T> _create;

    public Descriptor(string description, Func<T> create)
    {
        _description = description;
        _create = create;
    }

    public string Description { get { return _description; } }
    public T Create() { return _create(); }
}
公共类描述符
{
私有只读字符串\u描述;
私有只读函数创建;
公共描述符(字符串描述,函数创建)
{
_描述=描述;
_创建=创建;
}
公共字符串描述{get{return_Description;}}
public T Create(){return_Create();}
}
然后你可以为你的类型注册描述符。那你就可以很容易地打电话了

var descriptors = container.Resolve<IEnumerable<Descriptor<TaskParameters>>>();
var描述符=container.Resolve();

在这种情况下,元数据比命名更合适

对于强类型变量,定义一个保存元数据的接口:

public interface ITaskMetadata
{
    string Name { get; }
}
然后在生成时关联元数据:

builder.Register(c => [some type instantiation]))
    .As<TaskParameters>()
    .WithMetadata<ITaskMetadata>(m =>
        m.For(tm => tm.Name, "someTask"));

builder.Register(c => [some type instantiation]))
    .As<TaskParameters>()
    .WithMetadata<ITaskMetadata>(m =>
        m.For(tm => tm.Name, "someOtherTask"));
这用于避免在容器中查找任何内容


注意,
Lazy
类型来自.NET4。有关在.NET 3.5中实现此功能的详细信息以及其他语法,请参阅。

我没有找到任何解决方案,而是查询上下文:

    var ctx = Container.Resolve<IComponentContext>();
    var taskNames = ctx.ComponentRegistry.Registrations
        .Select(c => c.Services.FirstOrDefault() as KeyedService)
        .Where(s => s != null && s.ServiceType == typeof (TaskParameters))
        .Select(s => s.ServiceKey).ToList();
var ctx=Container.Resolve();
var taskNames=ctx.ComponentRegistry.Registrations
.Select(c=>c.Services.FirstOrDefault()作为KeyedService)
.Where(s=>s!=null&&s.ServiceType==typeof(TaskParameters))
.Select(s=>s.ServiceKey).ToList();

这种方法似乎没有实例化或激活任何内容。

元数据的问题是我无法从容器中查询它(有
ResolveNamed
ResolveKeyed
,但没有通过元数据解决)。我也找不到“For”扩展,它是在某个特殊的名称空间中吗?(AutoFac版本2.4.4.705)Intellisense(ReSharper?)在WithMetadata方法方面有问题-它仍应编译。如果您还想从容器中解析这些处理程序,请发布该场景的一些详细信息,您的问题只涉及通过委托给客户端来创建实例。对于快速和肮脏,可以使用Named()以及with metadata()。干杯
    var ctx = Container.Resolve<IComponentContext>();
    var taskNames = ctx.ComponentRegistry.Registrations
        .Select(c => c.Services.FirstOrDefault() as KeyedService)
        .Where(s => s != null && s.ServiceType == typeof (TaskParameters))
        .Select(s => s.ServiceKey).ToList();