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



我有一个名为IMyHook的接口,它在外部项目(dll)中有一些实现。 我在业务逻辑类中使用此接口,并在应用程序启动时使用 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 方法中加载哪个实现。例如

如果(标志 ==1) 然后加载实现 1否则如果(标志 == 2) 然后加载冲击 2等

我可以使用反射(以及我的外部类中表示每个标志值的自定义属性)来执行此操作,方法是加载程序集,然后在其上使用自定义属性加载适当的类。

但我的问题是;这是使用反射等在每个方法调用上加载外部DLL的正确方法,还是还有其他方法可以做到这一点?使用自动FAC或其他任何东西?

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

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

如果(标志 =

=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

如果以这种方式执行此操作,请考虑使用类型化元数据。

最新更新