Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/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# 4.0 使用autofac加载外部dll和有条件地注入多个实现的方法_C# 4.0_Dll_Reflection_Autofac - Fatal编程技术网

C# 4.0 使用autofac加载外部dll和有条件地注入多个实现的方法

C# 4.0 使用autofac加载外部dll和有条件地注入多个实现的方法,c#-4.0,dll,reflection,autofac,C# 4.0,Dll,Reflection,Autofac,我有一个名为sayimyhook的接口,它在外部项目(dll)中有一些实现。我在businesslogic类中使用此接口,在应用程序启动时,我使用Autofac注入此接口的外部实现 我的界面 public interface IMyHook { public void MyHookMethod(); } 我的商业逻辑课 public class myBusinessLogic{ // implementation injected by autofac public IMyH

我有一个名为sayimyhook的接口,它在外部项目(dll)中有一些实现。我在businesslogic类中使用此接口,在应用程序启动时,我使用Autofac注入此接口的外部实现

我的界面

public interface IMyHook {
    public void MyHookMethod();
}
我的商业逻辑课

public class myBusinessLogic{

  // implementation injected by autofac
  public IMyHook Hook {set;get;}

  public void MyBusinessLogicMethod (flag){

    if(Hook !=null){
      Hook.MyHookMethod(); 
    }
    else{
      // other code
    }
  }

}
自动面特性注入

var hoodAssemblyPath = "C:\\hook.dll"; 
builder.RegisterAssemblyTypes(hoodAssemblyPath).
AsImplementedInterfaces().PropertiesAutowired();
这一切正常,但现在的问题是,我的外部dll(hook.dll)可以有多个IMyHook实现。我想使用输入参数标志决定在MyBusinessLogicMethod方法中加载哪个实现。e、 g

如果(标志==1) 然后加载实现1 else if(标志==2) 然后加载Implement2 等

我可以使用反射(以及表示每个标志值的外部类中的自定义属性)通过加载程序集,然后使用自定义属性加载相应的类来实现这一点

但我的问题是,; 这是使用反射等在每个方法调用上加载外部dll的正确方法,还是有其他方法?使用autofac或其他什么


有了这些,我想让我的应用程序的用户将他们的代码注入到我的应用程序中,以实现一些功能。因此,外部dll或实现基本上由我的用户编写,然后我的应用程序将只加载并执行这些方法。

使用
AsImplementedInterfaces()注册所有依赖项可能相当繁重,在复杂场景中可能会遇到问题。此外,您将无法自定义每次注册的注册方式(控制生命周期范围等)
我建议注册用户必须在这些程序集中编写的模块。然后使用
注册表SemblyModule
加载它们

如果(标志==1),则加载实现1;如果(标志==2),则加载实现2,以此类推

您将如何决定使用哪个实现?implementation1是指来自Hook1.dll的实现

一种常见的方法是使用和/或

如果您不能要求您的用户实现模块,您可以使用以下方法:

    builder.RegisterAssemblyTypes(hoodAssemblyPath)
            .AsImplementedInterfaces()
            .PropertiesAutowired()
            .WithMetadata("source", "hook1");
然后

    IFoo foo = container.Resolve<IEnumerable<Lazy<IFoo, String>>>()
                        .First(f => f.Metadata["source"] == "hook1")
                        .Value
IFoo foo=container.Resolve()
.First(f=>f.Metadata[“source”]==“hook1”)
价值

<>如果你这样做,考虑使用. 最后,我强迫我的用户在其程序集中创建模块,并在模块中注册组件时使用名称(我们都同意)。然后在我的业务逻辑类中,我使用我们(我和我的用户)都知道的每个类型/标志的名称解析注册的组件。