IoC и ASP.NET MVC Views - PullRequest
       28

IoC и ASP.NET MVC Views

1 голос
/ 17 июня 2009

Есть ли хороший способ заставить мой IoC разрешать зависимости от представлений? У меня есть собственный распознаватель IoC, основанный на замке Виндзор. У меня есть IResourceService, к которому я хотел бы иметь доступ в моих представлениях для разрешения некоторых строк.

Ответы [ 5 ]

1 голос
/ 26 июля 2009

Я бы выбрал метод расширения, а затем разрешил бы мои зависимости в этом:

public static class LocalizationExtentions
{
  public static string Localize(this HtmlHelper html, string resource)
  {
    var localize = IoC.Resolve<ILocalize>();
    return localize.For(resource);
  }
}

На мой взгляд:

<h1><%= Html.Localize("MainTitle") %></h1>
0 голосов
/ 18 июня 2009

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

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


Редактировать

http://aspnet.codeplex.com/sourcecontrol/changeset/view/23011?projectName=aspnet#266535

Является ли файл, который обрабатывает создание экземпляров страницы, сразу после нулевой проверки на viewInstance, вы можете попросить ваш локатор службы сделать внедрение свойства.

0 голосов
/ 17 июня 2009

Я не использую Winsor, но я думаю, что это возможно с внедрением сеттера, когда вы используете представления с выделенным кодом. Почему вы хотите разрешить зависимости от представлений? Это звучит как странная вещь.

0 голосов
/ 18 июня 2009

Не могли бы вы использовать оболочку, и внутри этой оболочки напрямую попросите Windsor разрешить эту службу для вас. Тогда, на ваш взгляд, просто используйте класс ResourceHelper, который передает все в ваш разрешенный сервис? Вы можете использовать класс ResourceHelper так же, как класс HtmlHelper в вашем представлении.

public interface IInjectionWrapper
{
    T Resolve<T>();
    object Resolve(Type service, object view);
    object Resolve(Type service);
}

public class WindsorWrapper: IInjectionWrapper
{
    private readonly static IWindsorContainer windsor;

    static WindsorWrapper()
    {
        string config = ConfigurationManager.AppSettings["WindsorConfig"];
        FileResource resource = new FileResource(config);

        windsor = new WindsorContainer(new XmlInterpreter(resource));
    }

    public T Resolve<T>()
    {
        T result = windsor.Resolve<T>();

        return result;
    }

    public object Resolve(Type service)
    {
        return windsor.Resolve(service);
    }
}

public interface IResourceService
{
    string LookupString(string key);
}

public class ResourceHelper : IResourceService
{
    private IResourceService _resources;

    public ResourceHelper()
    {
        IInjectionWrapper ioc = new WindsorWrapper();
        _resources = ioc.Reslove<IResourceService>();
    }

    public string LookupString(string key)
    {
        return _resources.LookupString(key);
    }
}
0 голосов
/ 17 июня 2009

Не могли бы вы разрешить его в вашем контроллере, а затем поместить его в ViewModel, чтобы получить доступ к разрешенному экземпляру?

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