Внедрение IPrincipal с помощью Unity Property Injection во время выполнения - PullRequest
2 голосов
/ 09 марта 2010

Использование Unity в приложении ASP.Net MVC 2 У меня есть различные зависимости от правильно созданных контроллеров. Однако я хочу убедиться, что текущий IPrincipal для пользователя будет передаваться посредством внедрения в Службы, Репозиторий более низкого уровня и т. Д.

Поэтому в сервисе более низкого уровня у меня есть что-то вроде:

[Dependency] IPrincipal CurrentUser {get; set;}

Если я использую инъекцию зависимостей свойств, я не получаю то, что хочу, потому что создается экземпляр экземпляра Контроллера ДО того, как будет доступен принципал User, и в любом случае Unity не знает, как получить учетные данные текущего пользователя.

Итак, я хочу, чтобы можно было внедрить IPrincipal текущего пользователя (или, возможно, RolePrincipal) в одну из зависимостей для контроллера.

Как я могу это сделать?

Ответы [ 3 ]

7 голосов
/ 09 марта 2010

Почему бы не взять прямой маршрут, а просто назначить его.

Thread.CurrentPrincipal = пользователь;

Внедрение зависимостей хорошо, но не позволяйте этому мешать лучшему инжектору зависимостей, программисту.

2 голосов
/ 01 сентября 2011

Хотя эта тема старая, похоже, у Джона Крюгера есть ответ, который, кажется, прямо отвечает на первоначальный вопрос: http://jonkruger.com/blog/2009/04/13/hiding-threadcurrentprincipal-from-your-code/

0 голосов
/ 09 марта 2010

Зачем вводить это? Текущий принципал уже присутствует как User. Это то, что мы используем, и до сих пор работает нормально. Пользователь не должен меняться в пределах одного запроса, не так ли?

protected void Application_AuthenticateRequest()
{
    var ticket = GetAuthenticationTicket();
    // Perform actual authentication, etc.
    MyUser user = BigAuthStuff();
    Context.User = user;
    Thread.CurrentPrincipal = user;
}

public class MyBaseController : Controller
{
    protected MyUser AuthenticatedUser
    {
        get { return User as MyUser; }
    }
}
...