Как я могу распространять пользовательский объект через мое приложение MVC?
Допустим, у меня есть объект, который похож на каждого пользователя, который пытается получить доступ к моему сайту. Этакий объект Session Scope, который должен быть виден на каждом View/Model/Controller внутри всего моего "приложения".
Я хотел бы создать его, когда я вызываю страницу и заполняю ее данными, поступающими из моей собственной базы данных.
Чем при View (как пример) вызывать myObject.Title. В WebForms я делаю это, расширяя класс UserControl, такой как:
public class iUserControl : System.Web.UI.UserControl
{
protected MyCurrentPage myCurrentPage;
public iUserControl()
{
}
protected override void OnLoad(EventArgs e)
{
myCurrentPage = new MyCurrentPageWrapper();
}
}
чем, для каждого UserControl, что-то вроде этого:
public partial class context_pippo_MyOwnUserControl : iUserControl
в MVC я не вижу расширения для каждого элемента управления, так как я могу добиться такого рода процесса? Я хотел бы избавиться от хранения элементов на сессии.
1 ответ
Если я правильно понимаю вопрос, я думаю, что я сделал нечто подобное в одном проекте. У меня было что-то вроде этого:
public interface IControllerBaseService
{
IUserService UserService {get;set;}
ShoppingMode ShoppingMode {get;set;}
...
}
public abstract class ControllerBase : Controller, IControllerBaseService
{
public IUserService UserService {get;set;} // this is injected by IoC
public ShoppingMode ShoppingMode
{
get
{
return UserService.CurrentShoppingMode; // this uses injected instance to get value
}
...
}
Пока я использую контейнер IoC для создания экземпляров контроллера, свойство UserService внедряется контейнером.
Теперь вы можете получить доступ к вашему интерфейсу из вида:
(IControllerBaseService)ViewContext.Controller
Чтобы иметь ярлыки для наиболее распространенных используемых свойств в IControllerBaseService
У меня было несколько методов расширения, что-то вроде этого:
public static ShoppingMode CurrentShoppingMode(this HtmlHelper helper)
{
return ((IContollerBaseService)helper.ViewContext.Controller).ShoppingMode;
}
Так что с точки зрения @Html.CurrentShoppingMode()