Здесь я вижу 2 варианта:
baseUrl
свой собственный клиент Retrofit
или Если бы вы использовали URL-адреса грубой силы, это, вероятно, не было бы правильным выбором, поскольку он полагался на создание нового экземпляра Retrofit
для каждого.
Теперь каждый раз, когда URL-адрес изменяется, вы просто воссоздаете после демонстрации UrlComponent
путем подачи его новым UrlModule
.
Очистить модуль @Singleton
, чтобы он обеспечивал GsonConverterFactory
и RxJavaCallAdapterFactory
для правильного использования кинжала и не воссоздать общие объекты.
@Module
public class SingletonModule {
@Provides
@Singleton
GsonConverterFactory provideOkHttpClient() {/**/}
@Provides
@Singleton
RxJavaCallAdapterFactory provideOkHttpClient() {/**/}
}
@Singleton
@Component(modules = SingletonModule.class)
interface SingletonComponent {
// sub component
UrlComponent plus(UrlModule component);
}
Представьте @UrlScope
для охвата ваших экземпляров Retrofit
.
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface UrlScope {
}
Затем создайте подкомпонент
@SubComponent(modules=UrlModule.class)
public interface UrlComponent {}
И модуль для него
@Module
class UrlModule {
private final String mUrl;
UrlModule(String url) { mUrl = url; }
@Provides
String provideUrl() {
return mUrl;
}
@Provides
@UrlScope
OkHttpClient provideOkHttpClient(String url) {
return new OkHttpClient.Builder().build();
}
@Provides
@UrlScope
Retrofit provideRetrofit(OkHttpClient client) {
return new Retrofit.Builder().build();
}
}
Retrofit
Произвести активацию компонента и использовать
class Dagger {
public void demo() {
UrlModule module = new UrlModule(/*some url*/);
SingletonComponent singletonComponent = DaggerSingletonComponent.create();
UrlComponent urlComponent = singletonComponent.plus(module);
urlComponent.getRetrofit(); // done.
}
}
Обеспечьте в этом случае правильно перехваченный перехватчик (@Singleton
) и реализуйте соответствующую логику.
@Module
class SingletonModule {
@Provides
@Singleton
GsonConverterFactory provideGsonConverter() { /**/ }
@Provides
@Singleton
RxJavaCallAdapterFactory provideRxJavaCallAdapter() { /**/ }
@Provides
@Singleton
MyApiInterceptor provideMyApiInterceptor() { /**/ }
@Provides
@Singleton
OkHttpClient provideOkHttpClient(MyApiInterceptor interceptor) {
return new OkHttpClient.Builder().build();
}
@Provides
@Singleton
Retrofit provideRetrofit(OkHttpClient client) {
return new Retrofit.Builder().build();
}
}
@Singleton
@Component(modules = SingletonModule.class)
interface SingletonComponent {
Retrofit getRetrofit();
MyApiInterceptor getInterceptor();
}
todo Implem введите MyApiInterceptor
. Вам нужно будет установить сеттер для базового url, а затем просто переписать / изменить запросы, проходящие через.
Затем снова запустите и используйте его.
class Dagger {
public void demo() {
SingletonComponent singletonComponent = DaggerSingletonComponent.create();
MyService service = singletonComponent.getRetrofit().create(MyService.class);
MyApiInterceptor interceptor = singletonComponent.getInterceptor();
interceptor.setBaseUrl(myUrlA);
service.doA();
interceptor.setBaseUrl(someOtherUrl);
service.doB();
}
}
В качестве третьего подхода вы также можете использовать отражение , чтобы просто изменить базовый базовый URL-адрес и я добавил это последнее только для полноты.
Мы на самом деле используем комбинацию NAnt и MSBuild с CruiseControl. NAnt используется для управления потоком сценария и называет MSBuild для компиляции проектов. После того, как физическая сборка инициирована, NAnt используется для публикации отдельных выводов сборки проекта к общему ресурсу.
я не уверен, что это лучшее процесс. Я думаю, что многие из нас все еще ищут большой инструмент сборки. Одна многообещающая вещь, которую я недавно услышал на Скалах.NET, эпизод 362 , PSake James Kovac, система сборки, которую он основывал полностью на PowerShell. Это звучит действительно многообещающим начиная с того, что можно сделать с PowerShell, довольно безгранично в теории.
Вообще говоря, у меня складывается впечатление, что NAnt предлагает большую гибкость по сравнению с MSBuild, тогда как (с моими относительно простыми потребностями) я до сих пор был в порядке с последним.
Я использовал MSBuild и NAnt, и я предпочитаю MSBuild, в основном потому, что по умолчанию требуется гораздо меньше настроек. Хотя вы можете чрезмерно усложнять вещи и загружать MSBuild с большим количеством ненужных настроек, в простейшем случае вы можете просто указать его на файл решения / проекта и запустить его, что в большинстве случаев в большинстве случаев достаточно.
Это также зависит от [1 110], что Вы создаете. Библиотека MSBuild SDC Task имеет несколько специальных задач. Например, для AD, BizTalk, и т.д.
существует более чем 300 задач, включенных в эту библиотеку включая задачи для: создание веб-сайтов, создание пулов приложений, создание пользователей ActiveDirectory, выполнение FxCop, конфигурирование виртуальных серверов, создание zip-файлов, конфигурирование COM + , создание долей папки, установка в GAC, конфигурирование SQL Server, конфигурирование BizTalk 2004 и BizTalk 2006, и т.д.
Я использовал оба и предпочитаю NAnt . Мне действительно трудно сказать, что одно "лучше", чем другое.
Мы используем MSBuild, потому что мы запустили с Visual Studio 2005 (теперь Visual Studio 2008), и MSBuild был уже "встроен" к SDK - на сервере сборки существует меньше обслуживания. Это - клон NAnt, действительно - оба инструмента бесконечно гибки в этом, они позволяют Вам создать сделанные на заказ задачи в коде, и у обоих есть достойный набор задач сборки сообщества, уже созданных.
Использование динамических языков сценариев, таких как Python, BOO, Ruby и т. Д., Для создания и поддержки сценариев сборки может быть хорошей альтернативой основанным на XML, таким как NAnt. (Они имеют тенденцию быть чище, чем XML.)
Я использую MSBuild полностью для создания. Вот мой универсальный сценарий MSBuild, который ищет дерево .csproj файлы и создает их:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
<UsingTask AssemblyFile="$(MSBuildProjectDirectory)\bin\xUnit\xunitext.runner.msbuild.dll" TaskName="XunitExt.Runner.MSBuild.xunit"/>
<PropertyGroup>
<Configuration Condition="'$(Configuration)'==''">Debug</Configuration>
<DeployDir>$(MSBuildProjectDirectory)\Build\$(Configuration)</DeployDir>
<ProjectMask>$(MSBuildProjectDirectory)\**\*.csproj</ProjectMask>
<ProjectExcludeMask></ProjectExcludeMask>
<TestAssembliesIncludeMask>$(DeployDir)\*.Test.dll</TestAssembliesIncludeMask>
</PropertyGroup>
<ItemGroup>
<ProjectFiles Include="$(ProjectMask)" Exclude="$(ProjectExcludeMask)"/>
</ItemGroup>
<Target Name="Build" DependsOnTargets="__Compile;__Deploy;__Test"/>
<Target Name="Clean">
<MSBuild Projects="@(ProjectFiles)" Targets="Clean"/>
<RemoveDir Directories="$(DeployDir)"/>
</Target>
<Target Name="Rebuild" DependsOnTargets="Clean;Build"/>
<!--
===== Targets that are meant for use only by MSBuild =====
-->
<Target Name="__Compile">
<MSBuild Projects="@(ProjectFiles)" Targets="Build">
<Output TaskParameter="TargetOutputs" ItemName="AssembliesBuilt"/>
</MSBuild>
<CreateItem Include="@(AssembliesBuilt -> '%(RootDir)%(Directory)*')">
<Output TaskParameter="Include" ItemName="DeployFiles"/>
</CreateItem>
</Target>
<Target Name="__Deploy">
<MakeDir Directories="$(DeployDir)"/>
<Copy SourceFiles="@(DeployFiles)" DestinationFolder="$(DeployDir)"/>
<CreateItem Include="$(TestAssembliesIncludeMask)">
<Output TaskParameter="Include" ItemName="TestAssemblies"/>
</CreateItem>
</Target>
<Target Name="__Test">
<xunit Assembly="@(TestAssemblies)"/>
</Target>
</Project>
(Извините, если это немного плотно. Скидка с цены, кажется, снимает пустые строки.)
Это довольно просто, хотя, после того как Вы понимаете, понятия и все зависимости обрабатываются автоматически. Я должен отметить, что мы используем файлы проекта Visual Studio, которые имеют большую логику, встроенную в них, но эта система позволяет людям создавать почти тождественно и в рамках Visual Studio IDE или в командной строке и все еще дает Вам гибкость добавляющих вещей к канонической сборке как xUnit тестирование, Вы видите в сценарии выше.
Тот, который - PropertyGroup то, где вся конфигурация происходит и вещи, может быть настроен, как исключение определенных проектов от сборки или добавления новых масок опытной сборки.
ItemGroup - то, где логика происходит, который находит все .csproj файлы в дереве.
Затем существуют цели, которые большинство людей, знакомых с, делает, nAnt, или MSBuild должен смочь следовать. При вызове цели Сборки она звонит __, Компиляция, __ Развертываются и __ Тест. Чистая цель называет MSBuild на всех файлах проекта для них для чистки их каталогов, и затем каталог глобального развертывания удален. Восстановите Чистые вызовы и затем Сборка.
Я был бы точно так же, как для броска FinalBuilder в к соединению. Это не свободно, но если Вы сыты по горло редактированием XML файлы и хотите, чтобы несколько более хорошее ( IMO) среда работало в, я дал бы ему движение.
я работал со всеми ними и имею, всегда возвращался в FinalBuilder.
Я использую коммерческое программное обеспечение, Automated Build Studio для целей сборки.
UppercuT использует NAnt для сборки, и это безумно простая в использовании среда сборки.
Автоматическая сборка - это просто: (1) имя решения, (2) путь управления исходным кодом, (3) название компании для большинства проектов!
Вот несколько хороших объяснений: UppercuT
Есть еще один новый инструмент сборки (очень интеллектуальная оболочка) под названием NUBuild . Он легкий, с открытым исходным кодом, чрезвычайно прост в настройке и обеспечивает практически бесконтактное обслуживание. Мне очень нравится этот новый инструмент, и мы сделали его стандартным инструментом для непрерывной сборки и интеграции наших проектов (у нас около 400 проектов от 75 разработчиков). Попробуйте сами.