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 # под обложками. Нажмите на поверхность и просмотрите свойства, чтобы увидеть название класса.
Таким образом, вы можете зарегистрировать его точно так же, как и любой другой класс. В этом случае.
container.RegisterType<Model1Container, Model1Container>();
Надеюсь, это поможет.