c# - Ninject:将客户端的程序集作为构造函数参数传递并使用属性从客户端指定所需的实现

标签 c# binding dependency-injection ninject constructor-injection

一般来说,我是 Ninject 和依赖注入(inject)的新手,所以请原谅我的菜鸟。 =)

我有多个 IConfig 接口(interface)的实现,它们扫描程序集及其依赖项以查找实现 IConfigOption 接口(interface)的类型。每个 IConfig 实现都从不同的来源检索它们的值。

这些实现将根 Assembly 从哪里开始扫描作为构造函数参数,我正试图提出一个注入(inject)这些值的绑定(bind)。到目前为止,我正在考虑以下内容:

Bind<IConfig>().To<Config>().WithConstructorArgument("rootAssembly", target);

我的问题是,我似乎无法找到一种方法来获取对将注入(inject) Config 类的 target 程序集的引用。如果没有 DI,我会使用 Assembly.GetCallingAssembly(),但在这种情况下,这会生成绑定(bind)所在的程序集,而不是所需的目标程序集。

此外,我需要一种方法来指定将接收注入(inject)的类/成员的预期实现,例如,客户端类 A 请求一个Config 使用 RoleEnvironment 的实现者和客户端类 B 要求使用 ConfigurationManagerConfig 实现者。以下是阐明预期用途的示例:

public class Client
{
    [UseApplicationConfig]
    public IHelper WithAppConfig { get; set; }

    [UseRoleEnvironmentConfig]
    public IHelper WithRoleEnvironmentConfig { get; set; }
}

public class Helper : IHelper
{
    public Helper(IConfig config)
    {
    }
}

我感觉要么我从错误的角度看待这个问题,要么我错过了明显的东西,但我不确定我应该寻找什么。怎么做才是最好的方法?

非常感谢。

编辑:添加了预期用途的示例,并为清楚起见改写了问题的某些部分。

最佳答案

如果您想获取有关对对象发出的请求的详细信息,请使用重载 WithConstructorArgument(string, Func<IContext, object>) .您可以使用提供的 IContext查找程序集名称(使用调试器四处查看,听起来您的布局可能很复杂,所以我无法提供具体代码)。

作为如何使用它的示例:

//get the full name of the requested object
Bind<IFoo>()
    .To<Foo>()
    .WithConstructorArgument("bar",
                             c => c.Request.FullName);

但是,在我看来,您似乎从错误的角度看待它。如果我没看错你的问题,听起来你有一个类可以扫描你的程序集,然后决定注入(inject)什么而不是让 Ninject 为你做。我想这是您不使用 DI 时留下的东西?

我会看一下使用 WhenInjectedInto 的上下文绑定(bind)注入(inject)特定 IHelper 的方法或自定义属性你想要进入构造函数。看这里:https://github.com/ninject/ninject/wiki/Contextual-Binding

链接页面实际上有一个执行类似操作的示例,可能对您有用:

Bind<IWarrior>()
    .To<Samurai>()
    .When(request => request.Target.Type.Namespace.StartsWith("Samurais.Climbing"));

我可能仍会使用 WhenInjectedInto或属性,因此您没有任何“魔术字符串”,以防您稍后重构您的 namespace 。

关于c# - Ninject:将客户端的程序集作为构造函数参数传递并使用属性从客户端指定所需的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10677636/

相关文章:

c# - 访问路径 '/iPhoneSimulator/Debug/ibtool-manifests'被拒绝

objective-c - 如何以编程方式绑定(bind) NSCollectionView 的 View 子类?

c# - 单点触控/三20 : Add many items to the first page of TTLauncherView

java - Spring构造函数注入(inject)和 super 调用冗长

c# - 在 LINQ 中用 SingleOrNew() 方法代替 SingleOrDefault() 怎么样?

c# - ValidationSummary 不显示错误

c# - 在 Windows 身份验证应用程序中从当前用户获取网络凭据

C++/CLR DataSourceUpdateMode::OnPropertyChanged with TextBox 将光标向左移动

java - Injector.getInstance(..) 为单例返回一个新实例

java - Guice 是否支持方法注入(inject)(非 setter 注入(inject))?