) о неправильном управлении жизненным циклом. Я предоставляю ссылку здесь, чтобы другие, кто нашел этот ответ и обходной путь, могли также наблюдать за решением проблемы в самой структуре.
ли даже настроить MVC3 для использования DependencyResolver, чтобы получить пользовательский ModelMetadataProvider или ModelValidatorProvider? Потому что на данный момент я не могу заставить его работать так, как когда-либо через DependencyResolver. Если я устанавливаю это явно через код в global.asax, он работает отлично, но IoC просто молча игнорирует мой код. Я использую пакет StructureMap от NuGet, так что ничего особенного.
Мои текущие подключения через global.asax Global.asax.cs
ModelMetadataProviders.Current = new RedSandMetadataProvider(ModelMetadataProviders.Current);
ModelValidatorProviders.Providers.Add(new RedSandValidatorProvider((IUnitOfWork)DependencyResolver.Current.GetService(typeof (IUnitOfWork))));
Они работают отлично. Я должен передать текущий ModelMetaDataProvider в качестве конструктора моему собственному, потому что вы можете одновременно подключать только один ModelMetaDataProvider. Поэтому я обрабатываю нужные мне вызовы, проверяя параметры метода и позволяя остальным перейти к базовой реализации.
Мой ModelValidatorProviders использует объект IUnitOfWork, у которого есть свойство Session, заполненное nHibernate. Я делаю это, потому что мне нужно определить, какие правила проверки определены в базе данных на основе проверяемого свойства.
Опять же, оба они работают. Но каждый раз, когда я пытаюсь настроить их, используя StructureMap, чтобы они были доступны для DependencyResolver, я не могу получить желаемый результат. Кто-нибудь еще делал это раньше и заставил его работать на самом деле полностью? Есть ли что-то необычное, что мне нужно сделать из-за параметров конструкторов? Существует ли определенный жизненный цикл, который должен быть установлен в регистрации StructureMap этих типов? Я смотрелвезде для примеров этого, но все они либо ссылаются на бета-версии, либо выпускают кандидатов MVC3, которые не относятся к окончательной версии, или являются статьями, в которых говорится, что это возможно, но на самом деле это не доказывается на примере.
Я ДЕЙСТВИТЕЛЬНО был бы признателен за чью-либо помощь в этом, потому что я стараюсь изо всех сил, насколько это должно быть просто, что все ресурсы в сети СКАЖИ, что это возможно, но я не могу в течение жизни повторить любое из их требований.
Обновить
Я использовал StructureMap.MVC3 1.0.5, я только что обновился до 1.0.6 после того, как заметил, что произошло обновление, однако между версиями, похоже, нет большой разницы?
Моя структура StructureMap
public static IContainer Initialize() {
ObjectFactory.Initialize(x =>
{
x.Scan(scan =>
{
//scan.AssembliesFromApplicationBaseDirectory(); //Would this let us setup dependancy injection to dynamically load plugins?
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.LookForRegistries();
});
//x.For<IExample>().Use<Example>();
//x.For<ITempDataProvider>().Use( new CookieTempDataProvider(HttpContext.Current.Request.RequestContext.HttpContext));
//x.For<ModelMetadataProvider>().Singleton().Use(new RedSandMetadataProvider(ModelMetadataProviders.Current));
//x.For<ModelValidatorProvider>().Use<RedSandValidatorProvider>();
});
return ObjectFactory.Container;
}
Я позволил Разрешителю зависимостей быть установленным методом Start (), добавленным пакетом с помощью WebActivator.
Вы можете увидеть строки, которые я пытался использовать для регистрации своих метаданных и провайдеров валидаторов. Я не знаю, правильно ли я это делал или нет. Я добавил вызов для сканирования реестров, потому что у меня есть реестр для настройки и добавления nhibernate в контейнер Structuremap.