У вас может быть модель, от которой наследуются все модели:
public abstract class MasterModel
{
public int NumberOfMessages { get; set; }
public string Username { get; set; }
}
И тогда у вас может быть какая-то фабрика моделей, которая создаст запрошенную модель:
public class ModelFactory : IModelFactory
{
private IUserRepository userRepository;
public ModelFactory(IUserRepository userRepository)
{
// Inject a repository .. or a service...
this.userRepository = userRepository;
}
public T Create<T>() where T : MasterModel, new()
{
var m = new T()
{
NumberOfMessages = this.userRepository.GetNumberMessages(currentUser) // Get current user somehow... HttpContext
};
return m;
}
}
Итак, вы вставляете IModelFactory в свой контроллер и затем используете его внутри действия:
[HttpGet]
public ViewResult DoSomething()
{
var model = this.modelFactory.Create<MyActionModel>();
return View(model);
}
Тогда ваш мастер имеет MasterModel
тип модели и затем может использовать эту информацию. Таким образом, вся ваша логика может храниться в сервисе / репозитории, который внедряется в фабрику, которая создает модель каждого представления. Это то, что я делаю, и это прекрасно работает.