LaNC1LoT
LaNC1LoT

Reputation: 61

How to use dependency injection for generic interfaces?

How to use dependency injection for generic interfaces? I want the IDrawView interface to be created in DrawPresenter, and it controls the view.

I do not know what to use, Ninject or something else. I am using WinForms.

Which is better to choose?

class Program
{
    static void Main(string[] args)
    {
        IDrawPresenter prisenter = new DrawPresenter(new DrawWindow());
        prisenter.Show();
        Console.ReadLine();
    }
}

public interface IView
{
    void Show();
}

public interface IDrawView : IView
{
    object GetGridDraw { get; }
}
public interface IPrisenter<TView> where TView : IView
{
    void Show();
}
public interface IDrawPresenter : IPrisenter<IDrawView>
{
    object SelectedDraws { get; }
}

public class DrawWindow : IDrawView
{
    public object GetGridDraw => 1;

    public void Show()
    {
        Console.WriteLine("Show Window");
    }
}

public abstract class BasePresenter<TView> : IPrisenter<TView>
where TView : IView
{
    protected BasePresenter(TView view)
    {
        View = view;
    }
    protected TView View { get; private set; }
    public void Show()
    {
        View.Show();
    }
}

public class DrawPresenter : BasePresenter<IDrawView>, IDrawPresenter
{
    public DrawPresenter(IDrawView view): base(view)
    {
    }
    public object SelectedDraws => View.GetGridDraw;
}

Can DI implement this?

IDrawPresenter prisenter = new DrawPresenter();   
    public DrawPresenter()
    {
    }

What I need to do for Presenter to manage the form.

Here is what I want to get. But this does not work ...

public class NinjectProgram
{
    //Gets the inject kernal for the program.
    public static IKernel Kernel { get; protected set; }
}

public class DependencyModule : NinjectModule
{
    public override void Load()
    {
        Bind<IDrawView>().To<DrawWindow>();
    }
}

    static void Main(string[] args)
    {
        StandardKernel Kernel = new StandardKernel();
        Kernel.Load(new DependencyModule());

        IDrawPresenter prisenter = new DrawPresenter();
        prisenter.Show();
        Console.ReadLine();
    }

public abstract class BasePresenter<TView> : IPrisenter<TView>
where TView : IView
{
    protected BasePresenter()
    {
        View = NinjectProgram.Kernel.Get<TView>();
    }
    protected TView View { get; private set; }
    public void Show()
    {
        View.Show();
    }
}

Upvotes: 2

Views: 175

Answers (2)

LaNC1LoT
LaNC1LoT

Reputation: 61

Thank you all, that’s what I wanted to do. Perhaps this will help someone in the future.

        static void Main(string[] args)
        {
            CompositionRoot.Wire(new DependencyModule());

            IDrawPresenter prisenter = new DrawPresenter();//kernel.Get<IDrawPresenter>();
            prisenter.Show();
            Console.ReadLine();
        }

    public class CompositionRoot
    {
        private static IKernel _ninjectKernel;

        public static void Wire(INinjectModule module)
        {
            _ninjectKernel = new StandardKernel(module);
        }

        public static T Resolve<T>()
        {
            return _ninjectKernel.Get<T>();
        }
    }

    public class DependencyModule : NinjectModule
    {
        public override void Load()
        {
            Bind<IDrawView>().To<DrawWindow>();
        }
    }

    public abstract class BasePresenter<TView> : IPrisenter<TView>
    where TView : IView
    {
        protected BasePresenter()
        {
            View = CompositionRoot.Resolve<TView>();//NinjectProgram.Kernel.Get<TView>();
        }
        protected TView View { get; private set; }
}

Upvotes: 1

Nkosi
Nkosi

Reputation: 247641

Also include the presenter in the container and resolve it.

public class DependencyModule : NinjectModule {
    public override void Load() {
        Bind<IDrawView>().To<DrawWindow>();
        Bind<IDrawPresenter>().To<DrawPresenter>();
    }
}

All its dependencies, if registered, will also be resolved and injected into the presenter

static void Main(string[] args) {
    var kernel = new StandardKernel();
    kernel.Load(new DependencyModule());

    IDrawPresenter presenter= kernel.Get<IDrawPresenter>();
    presenter.Show();
    Console.ReadLine();
}

The above is based on

public abstract class BasePresenter<TView> : IPrisenter<TView> where TView : IView {
    protected BasePresenter(TView view) {
        View = view;
    }
    protected TView View { get; private set; }
    public void Show() {
        View.Show();
    }
}

public class DrawPresenter : BasePresenter<IDrawView>, IDrawPresenter {
    public DrawPresenter(IDrawView view): base(view) {
    }
    public object SelectedDraws => View.GetGridDraw;
}

Upvotes: 0

Related Questions