Как решить пользовательский репозиторий с помощью Windsor IoC при запуске приложения? - PullRequest
1 голос
/ 28 июля 2010

Я получаю сообщение об ошибке «Ссылка на объект не установлена ​​на экземпляр объекта».когда я пытаюсь использовать репозиторий UserRepos.Вопрос в том, как я могу разрешить хранилище пользователей при запуске приложения (ASP.NET MVC). Что здесь не так?

public class MyApplication : HttpApplication
{
    public IUserRepository UserRepos;
    public IWindsorContainer Container;

    protected void Application_Start()
    {
        Container = new WindsorContainer();

        // Application services
        Container.Register(
            Component.For<IUserRepository>().ImplementedBy<UserRepository>()
        );
        UserRepos = Container.Resolve<IUserRepository>();
    }

    private void OnAuthentication(object sender, EventArgs e)
    {
        if (Context.User != null)
        {
            if (Context.User.Identity.IsAuthenticated)
            {
                //Error here "Object reference not set to an instance of an object."
                var user = UserRepos.GetUserByName(Context.User.Identity.Name);

                var principal = new MyPrincipal(user);
                Thread.CurrentPrincipal = Context.User = principal;
                return;
            }
        }
    }
}

Спасибо за помощь!

1 Ответ

4 голосов
/ 28 июля 2010

Причиной этого исключения является неправильное понимание жизненного цикла HttpApplication. Эти статьи объясняют это довольно хорошо:

в вашем случае это будет правильное использование контейнера:

public class MyApplication: HttpApplication {
    private static IWindsorContainer container;

    protected void Application_Start()     {
            container = new WindsorContainer();
            ... registrations
    }

    private void OnAuthentication(object sender, EventArgs e) {
        var userRepo = container.Resolve<IUserRepository>();
        ... code that uses userRepo
    }
}
...