ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 使用Ninject的.NET MVC3服务定位器/依赖性解析器问题

2019-05-21 20:53:19  阅读:264  来源: 互联网

标签:c dependency-injection asp-net-mvc-3 ninject service-locator


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

>存储库项目(使用下面提到的缓存基础结构)
>领域模型项目
>服务层项目
> MVC演示项目

我遇到了一个场景,我需要注入一个类的私有成员,该类只有一个静态构造函数,这使得构造函数注入失败.

有问题的类是使用我刚刚完成的AppFabric缓存实现的包装器. (对于那些如此倾向的人,我的实施基于
http://cgeers.wordpress.com/2010/07/04/windows-server-appfabric-caching/)

基本上我有:

> interface ICacheProvider
> class DefaultCacheProvider:ICacheProvider
> static class Cache(利用我注入的任何实现)

静态类缓存是我想要注入一个解析为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中注入ICacheProvider

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

但我个人更喜欢静态包装,方便使用.

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

谢谢你的任何信息.

解决方法:

我认为你的方法缺少控制反转容器的本质来提供依赖注入.

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)

非常强烈的观点通常包括对Singleton模式的厌恶,换句话说,使用静态类来提供服务.这里的问题是你编写的Cache类是与你引用的反模式相同的Singleton模式.

消耗Cache单例的代码是什么样的?让我提出一个假设.

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

在这种情况下,您通过使用Singleton抽象了IoC并避免了DI.我会建议

public class SomeClass
{
    private readonly ICacheProvider _cacheProvider;

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

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

现在,ICacheProvider的使用直接发生在需要它的类中,并且可以更容易地适应对ICacheProvider实现的更改.它具有简化测试的额外好处. Singleton模式几乎不可能进行测试.

标签:c,dependency-injection,asp-net-mvc-3,ninject,service-locator
来源: https://codeday.me/bug/20190521/1148707.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有