Можно ли даже настроить 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;
}
Я позволил Разрешителю зависимостей быть установленным при запуске () метод, добавленный пакетом с помощью WebActivator.
Вы можете видеть закомментированные строки, которые я пытался использовать для регистрации своих поставщиков метаданных и валидатора.Я не знаю, правильно ли я это делал или нет.Я добавил вызов для сканирования реестров, потому что у меня есть реестр для настройки и добавления nhibernate в контейнер Structuremap.