C# 4.0 使用autofac加载外部dll和有条件地注入多个实现的方法
我有一个名为sayimyhook的接口,它在外部项目(dll)中有一些实现。我在businesslogic类中使用此接口,在应用程序启动时,我使用Autofac注入此接口的外部实现 我的界面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
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”)
价值
<>如果你这样做,考虑使用. 最后,我强迫我的用户在其程序集中创建模块,并在模块中注册组件时使用名称(我们都同意)。然后在我的业务逻辑类中,我使用我们(我和我的用户)都知道的每个类型/标志的名称解析注册的组件。