5

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

现在有时我需要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 中是否已经有基础设施?

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

4

1 回答 1

4

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

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

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

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

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

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

于 2010-05-14T14:25:42.607 回答