如何将ninject本身注入具有扩展函数的静态类中

时间:2010-05-13 21:18:33

标签: c# extension-methods repository-pattern ninject ninject-2

我有一些带有扩展方法的静态类,它们使用存储库模式为实体添加“业务逻辑”。

现在有时我需要在这些扩展功能中创建一个新的IRepository

我目前正在通过我正在扩展的对象访问我的Ninject内核来解决它,但它真的很难看:

public static IEnumerable<ISomething> GetSomethings(this IEntity entity)
{
    using (var dataContext = entity.kernel.Get<IDataContext>())
        return dataContext.Repository<ISomething>().ToList();
}

我还可以创建一个静态构造函数,以某种方式从工厂访问Ninject内核,Ninject 2中是否已有基础结构?

有人知道更好的解决方案吗?有没有人对这种方式有一些意见来实现业务逻辑。

1 个答案:

答案 0 :(得分:4)

关于扩展方法的问题以及它们如何获取内容。你有两种方法:

  1. 服务位置 - 拥有全局内核并下拉到服务位置(与依赖注入不同)。这里的问题是你的实体(或其扩展)不应该假设它的上下文而是要求它

  2. 因为你是一个扩展方法,所以你扩展的东西会传递给你所需的东西

  3. 正如你或多或少猜到的那样,这个(有一个全局内核成为倾销场)是Ninject试图劝阻你的东西。通常,无论您使用什么(例如,MVC或WCF),扩展都将提供适当的内容。例如,WCF扩展名为http://github.com/ninject/ninject.extensions.wcf/blob/master/source/Ninject.Extensions.Wcf/NinjectServiceHost.cs

    这里更大的问题是这样的依赖关系可能不会传播到实体级别 - 它应该保持在服务级别并从那里传播(使用DDD词汇表)。

    您可能会发现this answer by me很有趣,因为它涵盖了这一点(更多来自建筑概念视角的Ninject技术)