gpt4 book ai didi

dependency-injection - Ninject:如何注入(inject)类库?

转载 作者:行者123 更新时间:2023-12-04 08:20:49 25 4
gpt4 key购买 nike

首先,我使用的是 Ninject 1.5。我有两个项目:Web 项目和一个类库。我的 DI 配置在 Web 项目中。在我的类库中,我定义了以下内容:

    public interface ICacheService<T>
{
string Identifier { get; }
T Get();
void Set( T objectToCache, TimeSpan timeSpan );
bool Exists();
}

然后是一个名为 的具体类分类缓存服务 .

在我的网络项目中,我绑定(bind)了两者:
Bind( typeof( ICacheService<List<Category>> ) ).To( typeof(CategoryCacheService)).Using<SingletonBehavior>();

在我的类库中,我有 HtmlHelper 类的扩展方法,例如:
public static class Category
{
[Inject]
public static ICacheService<List<Category>> Categories { get; set; }

public static string RenderCategories(this HtmlHelper htmlHelper)
{
var c = Categories.Get();

return string.Join(", ", c.Select(s => s.Name).ToArray());
}
}

有人告诉我你不能注入(inject)静态属性,我应该使用 内核.Get<>() - 但是...由于上面的代码在类库中,我无权访问内核。我怎样才能从这一点上获得内核,或者有更好的方法吗?

最佳答案

好问题要问。

使用 DI 的一半想法是从注入(inject)的代码中消除对实例化行为的关注/微调。因此,更改 Category 可能更有意义。类不再是 static ,在 ctor 中声明其依赖关系,并让客户端代码将其拼接在一起。

关于如何访问它,如果你真的确定它是一个好主意......通常你的想法是创建一个 CacheServiceResolver并将其注册 [在您的 Web 项目中]。然后将它传递给 Kernel实例作为其正在构造。这样你的 DLL 只绑定(bind)到你的 CacheServiceResolver 的接口(interface)上。 .

经常使用的另一种方法是在全局某处有一个最后的“服务定位器”设施,它公开一个“全局获取”。但这通常是个坏主意,只能用于临时的管道胶带用途。

要查看的另一件事是 Common Service Locator,它可以使库容器中立,尽管在 EL 之外,您不会发现很多用法,如 you shouldnt really show your container。 .

另一种选择是要求 Func<T>工厂方法和 Bind将其转换为解析它的 lambda,从您的代码中提取该查找。

编辑:在 Ninject 2 中,无需显式传入 Kernel正如我所说的那样 - 可以简单地要求 IKernel在你的 ctor 中,你会得到它,无论解析请求是否明确传递一个。

编辑2:对我的回答真的很不满意,试图让它更通用,而不是过多地屠杀它。总结是,理想的选项通常按以下顺序排列:

  • 没有容器工件,将拼接留给客户
  • 提供一个容器中立的扩展点,使用您图书馆领域的通用语言中的术语代替中和的抽象容器术语
  • 提供与容器无关的集成方法,例如 Common Service Locator
  • 然后才考虑让人们需要
  • 了解您的容器
  • 了解您的容器
  • 关于dependency-injection - Ninject:如何注入(inject)类库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1651174/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com