2012-02-14 1 views
0

Первый фон.Как я могу ввести детали, специфичные для запроса, в модели

Я пытаюсь предоставить модельный API своим коллегам, который выглядит примерно так.

public class ProductFilterViewModel : ModelBase 
{ 
    [SelectItem ManagerType = typeof(UnitManager) 
       SelectMethod = "GetUnits" 
       TextProperty = "Name" 
       ValueProperty = "Text"] 
    IEnumerable<SelectListItem> UnitSelectItems { get; set; } 

    public IModelContext ModelContext { get; set; } 

    // More properties etc. 
} 


public interface IModelContext 
{ 
    string AccessToken { get; } 
} 

Пользователи моего API должны либо быть в состоянии создать новый экземпляр (с помощью метода Factory, или с использованием контейнера Ninject, либо в порядке), либо экземпляры этой оценки для параметра контроллера и имеют следующие произойдет - свойства, связанные с [SelectItem], должны быть заполнены, и должен быть введен экземпляр IModelContext.

public class SomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     // or whatever 
     ProductFilterViewModel model = this.Container.Get<ProductFilterViewModel>(); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(ProductFilterViewModel model) 
    { 
     model.RunSearch(); // will internally use model.ModelContext.AccessToken; 
     return View(model); 
    } 
} 

Теперь свойство маркера доступ происходит из печенья и имеет важное значение для любого доступа к базе данных, которая происходит в рамках модели - в том числе автоматического населения этих свойств, приписываемых с [SelectItem]

я могу получить эту работу с идеальной привязкой к модели. Там, где я борюсь, как это сделать в случае без привязки без дублирования кода. В идеале модельное связующее будет использовать один и тот же завод/контейнер. Я попытался настроить вещи через DependencyResolver.Current, но потом я изо всех сил пытался настроить контейнер для ввода этого AccessToken из файла cookie во время запроса. Единственная другая идея, которую я имел, заключалась в том, чтобы сконфигурировать контейнер в классе ControllerBase, а затем получить доступ к нему из ControllerContext в моем связующем устройстве, но это кажется нехорошим.

ответ

2

Я думаю, что вы направляетесь в неправильном направлении. Модели не должны создаваться с использованием контейнера IoC. Они должны быть немыми контейнерами данных без каких-либо зависимостей.

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

Смежные вопросы