我正在编写一个应用程序,其中各种业务逻辑可以位于不同的程序集中,然后这些位用于构建期望两个接口的对象,如下所示:
public interface ISubjectSource {}
public interface IStudySource {}
public class Worker
{
public Worker(ISubjectSource subjectSource, IStudySource studySource)
{
....
}
}
单独的程序集可以包含ISubjectSource
和IStudySource
的各种实现。然后是配置文件:
"Study1":{
"assemblies":["Compare.Sql.dll"],
"mappingSource":"Compare.Sql.SqlSubjectSource,Compare.Sql",
"studySource":"Compare.Sql.SqlStudySource,Compare.Sql",
}
其中描述了为“Study1”构建工作者所需的内容。当各种源都有自己的依赖关系时,我的问题就到了(例如,Sql Sources采用一个接口来处理连接字符串可能来自不同文件的连接)。
所以,我的问题归结为:我如何告诉Ninject当我为study1创建一个worker时,确保它获取这些对象,但是当我为Study2创建一个worker时,它会得到另一组对象? / p>
答案 0 :(得分:0)
以下是我们的工作:
我们有一个接口IPlugin
,带有标识符和可枚举的模块。
public interface IPlugin
{
string Identification { get; }
IEnumerable<Type> Modules { get; }
}
模块中的类型必须全部继承自NinjectModule
。 Identification
是您在配置中引用的内容,例如“我想使用插件SQLStudySource”或“我想使用插件FileStudySource”。
然后我们使用https://github.com/ninject/ninject.extensions.conventions绑定一组特定程序集中的所有IPlugin实现(如插件文件夹中的所有程序集):
this.Bind(x => x.FromAssembliesInPath("foo")
.SelectAllClasses()
.InheritedFrom<IPlugin>()
.BindTo<IPlugin>());
接下来,根据配置激活插件(或者更确切地说是他们的模块):
IEnumerable<Type> activatedPluginModules = kernel
.GetAll<IPlugin>()
.Where(plugin => configuration.ActivatedPluginIdentifications.Contains(plugin.Identification)
.SelectMany(x => x.Modules)
.Distinct();
foreach(Type module in activatedPluginModules)
{
kernel.Load(module);
}
就是这样。