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

JJo*_*oos 5 c# extension-methods ninject repository-pattern ninject-2

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

现在有时我需要IRepository在这些扩展函数中创建一个新的.

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

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

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

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

Rub*_*ink 4

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

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

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

正如您或多或少猜到的那样,Ninject 试图劝阻您不要这样做(拥有一个成为垃圾场的全局内核)。一般来说,无论您使用什么,扩展(例如,MVC 或 WCF)都会在适当的情况下提供一些东西。例如,WCF扩展有http://github.com/ninject/ninject.extensions.wcf/blob/master/source/Ninject.Extensions.Wcf/NinjectServiceHost.cs

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

您可能会发现我的这个答案很有趣,因为它稍微涵盖了这个领域(更多来自架构概念角度的 Ninject 技术)