Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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#_.net_Generics_Autofac - Fatal编程技术网

C# Autofac注册外部引用程序集中定义的打开泛型类型

C# Autofac注册外部引用程序集中定义的打开泛型类型,c#,.net,generics,autofac,C#,.net,Generics,Autofac,我在尝试“自动”注册某些开放泛型类型的所有已关闭实现(如果这些实现是在引用的程序集中定义的)时遇到Autofac问题。 如果在主部件中定义了所有内容,则所有内容都可以正常工作 Assembly mainExecAssembly = System.Reflection.Assembly.GetEntryAssembly(); List<Assembly> assemblies= new List<Assembly>(); assemblies.Add(mainExecAss

我在尝试“自动”注册某些开放泛型类型的所有已关闭实现(如果这些实现是在引用的程序集中定义的)时遇到Autofac问题。 如果在主部件中定义了所有内容,则所有内容都可以正常工作

Assembly mainExecAssembly = System.Reflection.Assembly.GetEntryAssembly();
List<Assembly> assemblies= new List<Assembly>();
assemblies.Add(mainExecAssembly);
builder.RegisterAssemblyTypes(assemblies.ToArray())
       .AsClosedTypesOf(typeof(IMyOpenGenericTypeHandler<>))
       .AsImplementedInterfaces();
Assembly mainExecAssembly=System.Reflection.Assembly.GetEntryAssembly();
列表程序集=新列表();
assemblies.Add(mainExecAssembly);
builder.RegisterAssemblyTypes(assemblies.ToArray())
.AsClosedTypesOf(typeof(IMyOpenGenericTypeHandler))
.a实现接口();
但如果这些是在引用的程序集中定义的(这些程序集在引导时被迭代和加载):

Assembly mainExecAssembly=System.Reflection.Assembly.GetEntryAssembly();
列表程序集=新列表();
assemblies.Add(mainExecAssembly);
AssemblyName[]aNames=mainExecAssembly.GetReferencedAssemblys();
foreach(aNames中的var an)
{
Assembly a=Assembly.Load(一个.FullName);
增加(a);
}
builder.RegisterAssemblyTypes(assemblies.ToArray())
.AsClosedTypesOf(typeof(IMyOpenGenericTypeHandler))
.a实现接口();
然后,未注册开放泛型类型的具体实现

具体类型如下所示:

public class MyExtendedTypeHandler: IMyOpenGenericTypeHandler<MyExtendedType>
{
    public MyExtendedTypeHandler()
    {
    }
    public void Handle(MyExtendedType handle)
    {
    }
}

public interface IMyOpenGenericTypeHandler<T> where T: IMyT
{
    void Handle(T handle);
}

public interface IMyT
{
    Guid Id { get; set; }
}

public class MyType: IMyT
{
    public Guid Id { get; set; }
}

public class MyExtendedType: MyType
{
    public string Name { get; internal set; }

    public MyExtendedType(string name)
    {
        Id = Guid.NewGuid();
        Name = name;
    }
}
公共类MyExtendedTypeHandler:IMyOpenGenericTypeHandler
{
公共MyExtendedTypeHandler()
{
}
公共无效句柄(MyExtendedType句柄)
{
}
}
公共接口IMyOpenGenericTypeHandler,其中T:IMyT
{
空柄(T柄);
}
公共接口IMyT
{
Guid Id{get;set;}
}
公共类MyType:IMyT
{
公共Guid Id{get;set;}
}
公共类MyExtendedType:MyType
{
公共字符串名称{get;internal set;}
公共MyExtendedType(字符串名称)
{
Id=Guid.NewGuid();
名称=名称;
}
}

您确定
assemblies
变量包含请求的程序集吗?实际上,接口定义和实现接口的具体类型位于两个不同的外部程序集中,这似乎就是问题所在。如果接口的定义和实现泛型接口的类在同一个(外部)程序集中,则它可以工作。如何解决这个问题?我试图用一个在Autofac中注册东西的控制台应用程序重现这个问题,这个应用程序引用一个包含2个接口的程序集和另一个包含3个类的程序集。注册似乎有效。你能用谁引用谁以及哪些程序集包含哪种类型的信息更新你的问题吗?我检查了我的代码,发现确实在两个不同的名称空间中定义了两次接口,这导致了问题。修复后,Autofac将注册实现接口的所有类,也从外部程序集注册。谢谢你的支持。
public class MyExtendedTypeHandler: IMyOpenGenericTypeHandler<MyExtendedType>
{
    public MyExtendedTypeHandler()
    {
    }
    public void Handle(MyExtendedType handle)
    {
    }
}

public interface IMyOpenGenericTypeHandler<T> where T: IMyT
{
    void Handle(T handle);
}

public interface IMyT
{
    Guid Id { get; set; }
}

public class MyType: IMyT
{
    public Guid Id { get; set; }
}

public class MyExtendedType: MyType
{
    public string Name { get; internal set; }

    public MyExtendedType(string name)
    {
        Id = Guid.NewGuid();
        Name = name;
    }
}