Связывание моделей Unity IoC и MVC - PullRequest
1 голос
/ 18 мая 2010

Можно ли в моем контроллере иметь статическое поле для вызова связующего модуля?

Например.

public class AuctionItemsController : Controller
{
    private IRepository<IAuctionItem> GenericAuctionItemRepository;
    private IAuctionItemRepository AuctionItemRepository;

    public AuctionItemsController(IRepository<IAuctionItem> genericAuctionItemRepository, IAuctionItemRepository auctionItemRepository) {
        GenericAuctionItemRepository = genericAuctionItemRepository;
        AuctionItemRepository = auctionItemRepository;
        StaticGenericAuctionItemRepository = genericAuctionItemRepository;
    }

    internal static IRepository<IAuctionItem> StaticGenericAuctionItemRepository;

вот модель-папка

public class AuctionItemModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
        if (AuctionItemsController.StaticGenericAuctionItemRepository != null) {
            AuctionLogger.LogException(new Exception("controller is null"));
        }

        NameValueCollection form = controllerContext.HttpContext.Request.Form;

        var item = AuctionItemsController.StaticGenericAuctionItemRepository.GetSingle(Convert.ToInt32(controllerContext.RouteData.Values["id"]));

        item.Description = form["title"];
        item.Price = int.Parse(form["price"]);
        item.Title = form["title"];
        item.CreatedDate = DateTime.Now;
        item.AuctionId = 1;


        //TODO: Stop hardcoding this
        item.UserId = 1;

        return item;
    }}

Я использую Unity в качестве IoC, и мне странно регистрировать мой связыватель моделей в контейнере IoC.

Какие-нибудь другие хорошие конструктивные соображения, которые я должен сделать?

1 Ответ

3 голосов
/ 19 мая 2010

Нет, я бы не стал рассматривать эту хорошую практику. Прелесть дизайна API в целом и DI в частности заключается в том, что, как только что-то начинает выглядеть странно, это должно вызывать умственную тревогу. Ключевое слово static влияет на меня.

Как только вы начнете использовать статические свойства, нет смысла получать ваш репозиторий от Controlller - вы также можете получить его прямо из контейнера, что подразумевает антишаблон Service Locator . Как и сейчас, вы тесно связываете вашего ModelBinder с конкретным контроллером, хотя, похоже, нет причин, по которым вы захотите это сделать.

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

Подумайте о предполагаемой ответственности ModelBinder: она должна переводить контекстную информацию HTTP / HTML (представленную в виде простого текста) в строго типизированный объект. Вот и все. Если вы пытаетесь заставить его делать больше, вы нарушаете SRP.

Обезвоживание на основе значений формы HTML / строки запроса лучше оставить самому контроллеру. Когда у Контроллера есть надлежащий Доменный объект, он может передать его в Доменную модель. Это должно быть единственной ответственностью Контролера. В большинстве случаев вам вообще не нужен ModelBinder.

...