- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一般来说,我是 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 要求使用 ConfigurationManager
的 Config
实现者。以下是阐明预期用途的示例:
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/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!