【问题标题】:How do I Inject Dependencies with Ninject, where instances are deserialised from json如何使用 Ninject 注入依赖项,其中实例从 json 反序列化
【发布时间】:2011-02-14 03:30:47
【问题描述】:

这是我第一次尝试使用 DI,我选择了 ninject,因为据报道它的学习曲线很容易,并且有这个问题。

我正在创建这样的对象:

var registrants = JsonConvert.DeserializeObject<List<Registrant>>(input);

我目前有Registrant的这个构造函数

[Inject]
public Registrant(IMemberRepository memberRepository)
{
    _memberRepository = memberRepository;
}

使用 Ninject 将存储库依赖项注入反序列化对象的最佳方法是什么?

【问题讨论】:

    标签: asp.net dependency-injection ninject


    【解决方案1】:

    您不能对不是由 Ninject 创建的对象(例如反序列化对象)使用构造函数注入。但是你可以使用属性注入。只需拨打kernel.Inject(obj)

    剩下的一个问题是为什么要注入这些对象。通常,您不想对数据容器对象使用依赖注入。在适当的设计中,它们对服务没有任何依赖。需要对服务进行的操作由数据容器对象的所有者完成。我建议考虑重构您的设计。

    【讨论】:

    • +1 该死,重新阅读问题——这显然是正确答案!我开始想解释具有 [Inject] 属性并期望魔术不起作用,然后在设置示例代码并查看问题上的 asp.net 标记时偏离了方向。
    • 谢谢,我认为这可能是故事,这就是为什么这个问题非常开放:-) 我想我也会采纳你的重构建议
    【解决方案2】:

    假设您使用的是 Ninject V2,并且您在 ASP.NET 应用程序的上下文中使用它,您应该使用 Ninject.Web 进行连接。

    然后你设置一个带有Factory Method support的全局类:

    public class Global : NinjectHttpApplication
    {
        protected override Ninject.IKernel CreateKernel()
        {
            var kernel = new StandardKernel( new Module() );
            kernel.Components.Add( new FuncModule( ) );
            return kernel;
        }
    }
    

    Bind IMemberRepository 的模块注册到某事:

        public class Module : NinjectModule
        {
            public override void Load()
            {
                Bind<IMemberRepository>().To<MemberRepository>();
            }
        }
    

    页面连接起来是这样的:

    public class ThePage : PageBase
    {
        readonly Func<Registrant> _createRegistrant;
    
        public ThePage( Func<Registrant> createRegistrant )
        {
            _createRegistrant = createRegistrant;
        }
    
        private void OnCreateRegistrant()
        {
            var newRegistrant = _createRegistrant();
        }
    }
    

    NB 不能 100% 确定 Web 表单页面是否支持构造函数注入,或者是否需要将上述内容放到属性注入中......有人吗?

    (假设您拥有的课程如下:)

    public class MemberRepository : IMemberRepository
    {
    }
    
    public interface IMemberRepository
    {
    }
    
    public class Registrant
    {
        private readonly IMemberRepository _memberRepository;
        public Registrant( IMemberRepository memberRepository )
        {
            _memberRepository = memberRepository;
        }
    }
    

    【讨论】:

    • @Myster:正如我在对@Remo 的回答的评论中指出的那样,我错过了这样一个事实,即您想对正在反序列化的对象执行此操作。因此,这个示例对您没有多大用处,因为您正试图影响其他地方的对象创建,而不是简洁地管理您的创建。即使是这样,它在架构上也值得商榷......
    • 谢谢@Ruben,您注意到您正在回答一个不同的问题,出于兴趣...除了ThePage 类之外,我拥有所有代码,那里的想法是什么?注入“如何”创建注册人的能力?
    • @Myster: 1. 您可以通过从Ninject.PageBase 派生来自动将内容输入到 asp.net 页面中 2. 我链接到的模块将自动生成一个工厂,该工厂将生成一个对象并对其依赖项进行注入。不用你告诉它怎么做
    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    相关资源
    最近更新 更多