использование переменных web.config внутри web.config - PullRequest
4 голосов
/ 05 августа 2010

Я бы хотел, чтобы в моем файле web.config была определена переменная, которую я могу использовать в нескольких местах в файле web.config (и других файлах конфигурации). Это, вероятно, легче объяснить на примере ...

web.config

<?xml version="1.0"?>
<configuration>
    <appSettings>
        <add key="AuthServiceEndPoint" value="any_old_name_i_like"/>
    </appSettings>
    <system.web>

    ...

    <system.serviceModel>
        <client>
            <endpoint
                address="net.tcp://localhost/AuthService"
                binding="netTcpBinding"
                contract="MyServices.Contracts.IAuthService"
                name="#{AppSettings.AuthServiceEndPoint}"
                bindingConfiguration="netTcpBindingConfig"
            />

        </client>
    </system.serviceModel>
</configuration>

windsor.config

<?xml version="1.0" encoding="utf-8" ?>
<castle>
    <components>

        ...

        <component
            id="AuthProvider"
            service="MyServices.Client.IAuthProvider, MyServices.Client"
            type="MyServices.Client.AuthProvider, MyServices.Client"
            lifestyle="transient">
            <parameters>
                <endpoint>#{AppSettings.AuthServiceEndPoint}</endpoint>
            </parameters>
        </component>

    </components>
</castle>

Возможно ли это?


Редактировать (чуть больше информации)

У меня уже есть возможность доступа к AppSettings из моего файла windsor.config (который фактически обрабатывается замком Виндзор и пользовательским XmlInterpreter.

Реальный вопрос в том, могу ли я сделать это в моем web.config?

<?xml version="1.0"?>
<configuration>
    <appSettings>
        <add key="AuthServiceEndPoint" value="any_old_name_i_like"/>
    </appSettings>
    <system.web>

    ...

    <system.serviceModel>
        <client>
            <endpoint
                address="net.tcp://localhost/AuthService"
                binding="netTcpBinding"
                contract="MyServices.Contracts.IAuthService"
                name="#{AppSettings.AuthServiceEndPoint}"
                bindingConfiguration="netTcpBindingConfig"
            />

        </client>
    </system.serviceModel>
</configuration>

т.е. - переменная доступа в моем <appSettings> из других частей моего файла web.config.

Ответы [ 4 ]

0 голосов
/ 21 августа 2010

Здесь я снова отвечаю на свой вопрос: -S

Я решил это, написав NetTcpServiceLocator ...

public interface INetTcpServiceLocator
{
    EndpointAddress GetAddress(Type serviceType);
}

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

<services>
    <service contract="My.Services.TestService.Contracts.ITestService" address="net.tcp://localhost/TestService" />
</services>

Затем я создал прокси для каждой службы ...

public class TestServiceProxy : ITestService
{
    public SomeInformation GetSomeInformation(SomeParams @params)
    {
        using (var factory = new NetTcpServiceFactory<ITestService>())
        {
            var service = factory.Service;
            return service.GetSomeInformation(@params);
        }
    }
}

Мой контроллер зависит отСервис, который зависит от ITestService.Все это склеено вместе с Castle Windsor и с помощью внедрения зависимости свойств.

Итак, мой контроллер вызывает его Service, который, в свою очередь, вызывает ITestService (в данном случае прокси, который получает свою конечную точку из пользовательского раздела).обработчик).

Пользовательский обработчик раздела (который также является INetTcpServiceLocator) имеет виндзорский образ жизни «perWebRequest», поэтому он вызывается платформой, а web.config считывается в массив в памяти.Когда вызывается прокси-сервер службы, он просто извлекает соответствующую конечную точку в зависимости от типа контракта.

Все это зависит от типа контракта, поэтому больше не нужно иметь никаких переменных в web.config..

Я выбрал решение на основе кода, поскольку я не использую процесс сборки локально, только когда я отправляю свой код в Subversion, процесс сборки запускается на нашем сервере сборки.

0 голосов
/ 05 августа 2010

Интересно, возможно, у вас получится сделать это с Т4? Я думаю, что вы могли бы определить шаблон, который анализирует Web-Template.config и выводит Web.config? Конечно, это работает только для одного файла.

0 голосов
/ 05 августа 2010

Для этого вы можете использовать NAnt или MSBuild.Для обоих вам нужны отдельные файлы конфигурации, но при создании проекта они могут автоматически выполнять преобразования в вашем файле Web.config и других файлах конфигурации.

0 голосов
/ 05 августа 2010

Не то, чтобы я мог думать.Вы можете выполнить настройку в C # в global.asax.cs вместо xml-файла.

В качестве альтернативы, отредактируйте ваш web.config в процессе сборки, чтобы заменить все эти значения.FinalBuilder имеет аккуратное действие «Редактировать XML-файл», которое достаточно хорошо использует XPath для этого, и FinalBuilder имеет переменные.Задача решена.Вот как я делаю свои сборки на работе.

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