diff --git a/src/Avalonia.Controls/AppBuilderBase.cs b/src/Avalonia.Controls/AppBuilderBase.cs
index d69052ad3d..f616a42cac 100644
--- a/src/Avalonia.Controls/AppBuilderBase.cs
+++ b/src/Avalonia.Controls/AppBuilderBase.cs
@@ -88,6 +88,23 @@ namespace Avalonia.Controls
};
}
+ ///
+ /// Begin configuring an .
+ ///
+ /// Factory function for .
+ /// The subclass of to configure.
+ /// is useful for passing of dependencies to .
+ /// An instance.
+ public static TAppBuilder Configure(Func appFactory)
+ where TApp : Application
+ {
+ return new TAppBuilder()
+ {
+ ApplicationType = typeof(TApp),
+ _appFactory = appFactory
+ };
+ }
+
protected TAppBuilder Self => (TAppBuilder)this;
public TAppBuilder AfterSetup(Action callback)
diff --git a/tests/Avalonia.Controls.UnitTests/AppBuilderTests.cs b/tests/Avalonia.Controls.UnitTests/AppBuilderTests.cs
index b5004bc6a5..06ec9158fe 100644
--- a/tests/Avalonia.Controls.UnitTests/AppBuilderTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/AppBuilderTests.cs
@@ -1,4 +1,5 @@
-using Avalonia.Controls.UnitTests;
+using System;
+using Avalonia.Controls.UnitTests;
using Avalonia.Platform;
using Xunit;
@@ -18,6 +19,22 @@ namespace Avalonia.Controls.UnitTests
{
}
+ public class AppWithDependencies : Application
+ {
+ public AppWithDependencies()
+ {
+ throw new NotSupportedException();
+ }
+
+ public AppWithDependencies(object dependencyA, object dependencyB)
+ {
+ DependencyA = dependencyA;
+ DependencyB = dependencyB;
+ }
+ public object DependencyA { get; }
+ public object DependencyB { get; }
+ }
+
public class DefaultModule
{
public static bool IsLoaded = false;
@@ -53,7 +70,30 @@ namespace Avalonia.Controls.UnitTests
IsLoaded = true;
}
}
-
+
+ [Fact]
+ public void UseAppFactory()
+ {
+ using (AvaloniaLocator.EnterScope())
+ {
+ ResetModuleLoadStates();
+
+ Func appFactory = () => new AppWithDependencies(dependencyA: new object(), dependencyB: new object());
+
+ var builder = AppBuilder.Configure(appFactory)
+ .UseWindowingSubsystem(() => { })
+ .UseRenderingSubsystem(() => { })
+ .UseAvaloniaModules()
+ .SetupWithoutStarting();
+
+ AppWithDependencies app = (AppWithDependencies)builder.Instance;
+ Assert.NotNull(app.DependencyA);
+ Assert.NotNull(app.DependencyB);
+
+ Assert.True(DefaultModule.IsLoaded);
+ }
+ }
+
[Fact]
public void LoadsDefaultModule()
{