gpt4 book ai didi

c# - Ninject 的 .NET MVC3 服务定位器/依赖解析器问题

转载 作者:太空狗 更新时间:2023-10-29 23:18:18 27 4
gpt4 key购买 nike

我有一个我一直在玩/学习的标准 .NET MVC3 存储库模式项目。这是非常标准的结构。

  • 存储库项目(具有下面提到的缓存基础设施)
  • 领域模型项目
  • 服务层项目
  • MVC 演示项目

我遇到过这样一种情况,我需要注入(inject)一个只有静态构造函数的类的私有(private)成员,这让我无法进行构造函数注入(inject)。

有问题的类是使用我刚刚完成的 AppFabric 缓存实现的包装器。 (对于那些如此倾向的人,我的实现是基于 https://github.com/geersch/AppFabric )

基本上我有:

  • 接口(interface) ICacheProvider
  • 类 DefaultCacheProvider : ICacheProvider
  • 静态类缓存(利用我注入(inject)的任何实现)

我想在静态类缓存中注入(inject)一个解析为 DefaultCacheProvider 的 ICacheProvider。

    private static readonly ICacheProvider CacheProvider;

static Cache()
{
//DependencyResolver.Current.GetService<ICacheProvider>();

//CacheProvider =
// (ICacheProvider)ServiceLocator.Current
// .GetInstance(typeof(ICacheProvider));
}

public static void Add(string key, object value)
{
CacheProvider.Add(key, value);
}

public static void Add(string key, object value, TimeSpan timeout)
{
CacheProvider.Add(key, value, timeout);
}

public static object Get(string key)
{
return CacheProvider[key];
}

public static bool Remove(string key)
{
return CacheProvider.Remove(key);
}

根据我所读到的内容,这似乎是 ServiceLocator 的一个场景,但我看到了一些关于它的非常强烈的意见(反模式等),而且我对它的熟悉程度很低所以我不确定一个可行的实现。

我在 StackOverflow 上看到了将 Cache 类设计为标准类并在 SingletonScope 中注入(inject) ICacheProvider 的建议

kernel.Bind<ICacheProvider>().To<DefaultCacheProvider>().InSingletonScope();

但我个人更喜欢静态包装器以便于使用。

是 ServiceLocator 设置到这里的方式还是有其他明显的我不知道的东西?如果 ServiceLocator 是可行的方法,是否可以与 Ninject 搭配使用?我知道 Ninject 现在具有服务定位器功能,但不确定如何实现。

感谢您提供任何信息。

最佳答案

我认为您的方法缺少控制反转容器提供依赖注入(inject)的本质。

Based off what I've read, this seems like a scenario for ServiceLocator but I've seen some very strong opinions on it (anti pattern, etc. etc)

非常强烈的意见通常包括对单例模式的反感,或者换句话说,使用静态类来提供服务。这里的问题是您编写的 Cache 类与您提到的反模式是同一个单例模式。

使用Cache 单例的代码是什么样的?让我提出一个假设。

public class SomeClass
{
public string GetSomeMetaData()
{
return Cache.Get("magicKey");
}
}

在这种情况下,您已经抽象了 IoC 并通过使用单例避免了 DI。我建议

public class SomeClass
{
private readonly ICacheProvider _cacheProvider;

public SomeClass(ICacheProvider cacheProvider)
{
_cacheProvider = cacheProvider;
}

public string GetSomeMetaData()
{
return _cacheProvider.Get("magicKey");
}
}

现在 ICacheProvider 的消耗直接发生在需要它的类中,并且可以更轻松地适应对 ICacheProvider 实现的更改。它具有简化测试的额外好处。单例模式几乎不可能进行测试。

关于c# - Ninject 的 .NET MVC3 服务定位器/依赖解析器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5751420/

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