Asp.net MVC Dependency Injection в дженериках - PullRequest
1 голос
/ 08 октября 2011

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

У моих контроллеров есть следующий Contructor

    IDbContext _db;

    public PagesController(IDbContext db)
    {
        _db = db;
    }

Очевидно, что это не работает сразу, поэтому я создал следующую зависимость

x.For<IDbContext>().Use<ContextDb>();

Достаточно запутанно, я назвал приложение "Контекст" -> отсюда ContextDb (не путайте его с DbContext или IDbContext)

Хорошо, теперь моя проблема.В файле Global.asax я решил, что хочу DropCreateDatabaseIfModelChanges, поэтому я пошел и добавил следующее:

DbDatabase.SetInitializer<IDbContext>(new DropCreateDatabaseIfModelChanges<IDbContext>));

Очевидно, что это не работает, IDbContext - этоинтерфейс и правила зависимости решают, какая реализация используется.Таким образом, единственный способ выполнить эту работу - использовать следующее:

DbDatabase.SetInitializer<ContextDb>(new DropCreateDatabaseIfModelChanges<ContextDb>));

Однако, что-то вроде победы над целью внедрения этой зависимости?Как я мог решить это?

1 Ответ

1 голос
/ 11 октября 2011

Вы можете установить класс ContextDB в Web.Config и использовать ConfigurationManager, чтобы получить его или какой-либо файл конфигурации, и настроить активатор для вызова его в Global.asax.cs, как показано ниже:

String configString = ConfigurationManager.AppSettings["MyDBContextType"];
IDBContext db = (IDBContext)Activator.CreateInstance(Type.GetType(configString));

Это сохранит цель этого внедрения зависимости.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...