这是我第一次尝试使用DI,我选择了ninject因为它据说容易学习曲线,并且有这个问题。
我正在创建这样的对象:
var registrants = JsonConvert.DeserializeObject<List<Registrant>>(input);
我目前有Registrant
[Inject]
public Registrant(IMemberRepository memberRepository)
{
_memberRepository = memberRepository;
}
使用Ninject将存储库依赖项注入反序列化对象的最佳方法是什么?
答案 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;
}
}