使用Ninject避免属性注入

时间:2015-05-24 14:00:35

标签: c# wpf dependency-injection ninject prism

我一直在读物业注入是不好的,但我有一个用法,我可以证明自己,私人财产注入不少。但我想知道是否可以采用不同的方式。

所以,我的问题是我正在为一个应用程序创建(Prism)模块,他们需要像这样实现IModule接口

public class Configuration : NinjectModule
{
    public override void Load()
    {
        ...
        //Binding here
        ...
    }
}

public class MyModule : IModule
{
    private readonly IKernel _kernel;
    private readonly IRegionManager _regionManager;

    public MyModule (IKernel kernel, IRegionManager regionManager)
    {
        _kernel = kernel;
        _regionManager = regionManager;
    }
    public void Initialize()
    {
        _kernel.Load<Configuration>();
        //register views and the like here.
    }
}

然而,这在我的世界中并不是最佳的。例如,我总是要注入内核和区域管理器。我可以在像这样的抽象类中处理大部分内容

public abstract class AModule : IModule
{
    protected IKernel Kernel { get; set; }
    protected IRegionManager RegionManager { get; set; }

    protected AModule(IKernel kernel, IRegionManager regionManager)
    {
        Kernel = kernel;
        RegionManager = regionManager;
    }

    public virtual void Initialize()
    {
        Kernel.Load(CreateConfiguration());
    }

    protected abstract NinjectModule CreateConfiguration();
}

public class MyModule : IModule
{
    public MyModule (IKernel kernel, IRegionManager regionManager)
        : base(kernel,  regionManager)
    {
    }

    public void Initialize()
    {
        base.Initialize();
        //register views and the like here.
    }

    protected override NinjectModule CreateConfiguration()
    {
        return new Configuration();
    }
}

但我还是要担心构造函数定义中的内核和区域管理器。理想情况下,我想避免完全像这样编写构造函数

public abstract class AModule : IModule
{
    [Inject]
    protected IKernel Kernel { get; set; }

    [Inject]
    protected IRegionManager RegionManager { get; set; }

    public virtual void Initialize()
    {
        Kernel.Load(CreateConfiguration());
    }

    protected abstract NinjectModule CreateConfiguration();
}

这允许我像这样编写模块

public class MyModule : AModule
{
    public override void Initialize()
    {
        base.Initialize();
        //register views and the like here.
    }

    protected override NinjectModule CreateConfiguration()
    {
        return new Configuration();
    }
}

为什么这是一个不好的方法,甚至可以在没有属性注入的情况下做到这一点?

0 个答案:

没有答案