如何使用Ninject注入依赖项,其中实例从json反序列化

时间:2011-02-14 03:30:48

标签: asp.net dependency-injection ninject

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

我正在创建这样的对象:

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

我目前有Registrant

的构造函数
[Inject]
public Registrant(IMemberRepository memberRepository)
{
    _memberRepository = memberRepository;
}

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

2 个答案:

答案 0 :(得分:6)

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

剩下的一个问题是你想要注入这些对象的原因。通常,您不希望对数据容器对象使用依赖注入。在适当的设计中,他们不依赖于服务。需要对服务执行的操作由数据容器对象的所有者完成。我建议考虑重构你的设计。

答案 1 :(得分:1)

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

然后设置一个连接Factory Method support的Global类:

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;
    }
}