Question

I would like to implement CastleWindsor with the MVP pattern, but I keep getting an 'Object Reference Not Set to an Object reference on the Presenter when the repository is called to obtain some data.

This is how I did it and I am wondering if there is anything wrong, so please let me know if you can:

Presenter:

public class CategoryPresenter
{
    ICategoryRepository categoryRepository;
    ICategoryView categoryView;

    public CategoryPresenter(ICategoryView _categoryView, ICategoryRepository _categoryRepository)
    {
        categoryView = _categoryView;
        categoryRepository = _categoryRepository;
    }

    //public CategoryPresenter(ICategoryView _categoryView) : this (_categoryView, new CategoryRepository())
    //{ }

    public CategoryPresenter(ICategoryView _view)
    {
        categoryView = _view;
    }

    public IEnumerable<object> GetActiveCategories()
    {
      return  categoryRepository.GetActiveCategories();
    }
}

IoC Class:

public  static class IoC
{
    public static IWindsorContainer windsorContainter { get; set; }
}

IoCConfig Class:

class IoCConfig {

    public static IWindsorContainer RegisterCastleWindsorContainer()
    {
        IWindsorContainer windsorContainer = new WindsorContainer()
        .Install(new RepositoryInstaller())

        IoC.windsorContainter = windsorContainer;

        return windsorContainer;
    }

}

Installer Class:

public class RepositoryInstaller: IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Component.For<ICategoryRepository>().ImplementedBy<CategoryRepository>).LifestyleTransient());

    }
}

Finally in Global.ascx file I am doing this at App_Start:

    void Application_Start(object sender, EventArgs e)
    {            
        // Code that runs on application startup
        IoCConfig.RegisterCastleWindsorContainer();
    }

With this, the error message is as said above; the error happens at the presenter's method: GetActiveCategories();

As you see at no where in code I invoke the resolve method on the container.

Please let me know if if you have any suggestions.

Thank you.

Was it helpful?

Solution

I have resolved this to the IoC Class

    public static T Resolve<T>()
    {
        try
        {
            return windsorContainer.Resolve<T>();
        }
        catch (Exception e)
        {
            throw e;
        }
    }

And then add this to the presenter:

   ICategoryRepository categoryRepository = IoC.Resolve<ICategoryRepository>();
   ICategoryView categoryView = IoC.Resolve<ICategoryView>();
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top