Unity Mvc3 - настройка с использованием базы данных в первую очередь - PullRequest
0 голосов
/ 07 марта 2012

Я проверял Microsot Unity IOC и нашел несколько примеров с использованием подхода Code First. С другой стороны, я не могу найти учебник или конфигурацию, чтобы включить Unity IoC в файлы edmx, используя сначала подход базы данных. Я буду рад, что кто-нибудь может пролить свет на это.

Я пытался использовать http://unitymvc3.codeplex.com/ и напрямую использовать Unity 2.1 = http://unity.codeplex.com/

извините, что я не могу предоставить код, но на самом деле я очень запутался в шаблонах IOC и не смог создать демонстрационное решение. brgds.

1 Ответ

3 голосов
/ 07 марта 2012

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

Все контейнеры IoC одинаковы, у них есть некоторый способ регистрации или обнаружения зависимостей, а затем способ разрешения ссылок. В основном решение включает запрос ссылки на FooClass и получение объекта взамен. Часто вы фактически не запрашиваете конкретный тип, такой как FooClass, а вместо этого запрашиваете IFooClass, чтобы отделить ваше использование от фактического типа, который передается.

Так что в вашем случае вам нужно зарегистрировать свой контекст данных EF как зависимость в единстве. Раньше я не использовал «единство», поэтому, пожалуйста, прости за небольшие ошибки.

container.RegisterType<YourContext, YourContext>();

Добавьте зависимость к вашему классу. Допустим, у вас есть FooRepository, который реализует IFooRepository.

public FooRepository : IFooRepository 
{
    private YourContext context;

    public FooRepository(YourDataContext context) {
         this.context = context;
    }
}

В MVC 3 вы регистрируете Unity в качестве средства разрешения зависимостей по умолчанию, что означает, что все запросы на контроллеры проходят через него;

protected void Application_Start()
{
    ...
    var container = new UnityContainer();
    container.RegisterType<YourContext, YourContext>();
    container.RegisterType<IFooRepository, FooRepository>();

    container.RegisterControllers();

    DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}

Теперь ваш контроллер может добавлять аргументы в свой конструктор и заполнять их.

public class MyController : Controller 
{
    private IFooRepository repository;

    public MyController(IFooRepository repository)  {
        this.repository = repository;
    }

}

Когда этот контроллер будет создан, он получит экземпляр IFooRepository, который получит ссылку на YourContext. Это продолжается до самого конца.

EDIT

Файл edmx - это просто конструктор, который создает класс контекста C # под обложками. Нажмите на поверхность и просмотрите свойства, чтобы увидеть название класса.

enter image description here

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

container.RegisterType<Model1Container, Model1Container>();

Надеюсь, это поможет.

...