【问题标题】:How to inject ninject itself into a static class with extension functions如何将ninject本身注入具有扩展功能的静态类
【发布时间】:2010-05-13 21:18:32
【问题描述】:

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

现在有时我需要在这些扩展函数中创建一个新的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 中是否已经有相应的基础架构?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    正如您或多或少猜到的那样,这(拥有一个成为垃圾场的全局内核)是 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 技术)

    【讨论】:

    • 感谢您的回答。我也不是很喜欢服务地点,在我看来,我现在正在做的事情更丑陋。我将在这里解决更大的问题,这不是添加业务逻辑的正确位置。我希望有一些神奇的方法来注入一个静态构造函数。所以我可以保留我的设计,而不是让它太难看。我会把这个问题再开放几个小时,如果没有 AOP 天才出现,我会接受你的回答!
    • 你不会在这里找到天才——只有在论坛上寻找答案的人——他们都在 Ninjecxt 邮件列表中:D 底部是静态方法 [如扩展方法],没有上下文或机会以任何简单的方式进行拦截。在newing 处,可以通过各种方式将上下文向下流入实体(NHibernate 和 L2S 各有自己的方式)。问题是您不希望实体将事情掌握在自己的手中,并随意追逐其他存储库。效率也会受到影响——除非你走类似 Hiro 的路线。
    • 埃文斯 DDD 书(无论您做什么,都必须认真阅读,即使吸收它会有点伤脑筋)和/或 thinkddd.com 将真正帮助您全面思考在这里设计。如果你真的在寻找重型 AOP 的东西,你会在 PostSharp 的方向找到它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多