asp.net 标准化Blazor Startups,在库中使用应用程序构建器

i5desfxk  于 2023-10-21  发布在  .NET
关注(0)|答案(1)|浏览(108)

在工作中,我们使用Blazor开发了一个软件系统,我们也在考虑使用我们的通用组件和页面创建桌面应用程序。目前,我们的网站服务器的所有初创公司几乎都只是复制和粘贴,当然这并不理想。在家里,我正在使用标准化工具,我很成功。
让我再举一个例子,这样我的目标就更容易理解了:
我的目标是实现一个创建和配置应用程序的“ApplicationBuilder”。我需要能够使用继承去标准化常见的构建器。特别是因为我们为客户定制了我们的软件。
这会导致类似这样的结果:

// Common implementation
class CommonAppBuilder
{
    public virtual Application CreateApplication()
    {
        var builder = MauiAppBuilder.CreateBuilder(); // Or some other builder for Blazor Server for example...

        // Configuration of something like a MauiAppBuilder or IConfiguration or our IServiceCollection is done in other methods of this builder that will be invoked at some point in here
    }

    // More stuff ...
}

// Application A implementation (application specific, still a standard application)
class ApplicationAAppBuilder : CommonAppBuilder
{
    public override Application CreateApplication()
    {
        var builder = base.CreateApplication();

        // Here I want to be able to add or intercept (simply override and differ from) the common, standard implementation of configuring and settings up our startup
    }

    // Maybe more overrides if need be...
}

// Customized application A implementation (application and customer specific)
class CustomApplicationAAppBuilder : ApplicationAAppBuilder
{
    public override Application CreateApplication()
    {
        var builder = base.CreateApplication();

        // Same story, I want to be able to inherit and override the respective standard, so I can replace standard parts with parts that need to be customized or simply add more...
    }
}

// Main(string[])
class Program
{
    public static void Main(string[] args)
    {
        // Everything about the applications configuration takes place in my application builder, so it can be standartized and override if need be
        new CustomApplicationAAppBuilder(args)
            .CreateApplication()
            .Run();
    }
}

现在我知道这是非常规的,但可能比复制和粘贴25个以上的标准应用程序和更多的自定义版本的应用程序创业公司更好。
我实际上设法让这些建设者工作,但我目前有以下几个:

  • MAUI Blazor项目剥离了除了那种构建器之外的所有内容,因此我可以访问MauiAppBuilder
  • Blazor服务器项目剥离了除了那种构建器之外的所有内容,这样我就可以访问WebAppBuilder。这也有一个类,其中有一个静态的主方法,因为它不会编译,否则。
  • 常规C#项目仅使用通用扩展方法,因此Web服务器和桌面应用程序可以共享相同的扩展方法。就我所尝试的而言,我不能让Blazor Server引用MAUI应用程序,反之亦然,但即使如此,我仍然会有两个几乎没有任何内容的项目。
  • 当然,我仍然有Blazor Server Web服务器和MAUI Blazor Desktop版本的同一个程序,所以还有两个项目。

我现在在想:

  • 有没有可能添加某种NuGet包来将MauiAppBuilders和WebAppBuilders添加到常规的Razor库中,从而将这三个项目合并为一个?我没有找到一个,也没有设法“转换/更改”项目,同时保持使用MauiAppBuilders和WebAppBuilders的可能性。
  • 这种类型的应用程序构建器会导致任何问题吗?“我知道,我不知道。
  • 有没有更好的方法来实现我们所需要的?
jmo0nnb3

jmo0nnb31#

如果我没理解错的话。是的,有一个更干净的方法。这是DotnetCore团队的工作方式。
举例来说:

builder.Services.AddRazorComponents()
    .AddServerComponents();

这在库中定义了Extension方法[用于WebApplicationBuilderIServiceCollection ],以定义该库所需的服务。您可以为不同的部署使用多种方法,例如:Blazor Server,WASM,API Server,.
下面是在基础设施项目中定义的基础设施域服务。

public static class ApplicationInfrastructureServices
{
    public static void AddAppServerInfrastructureServices(this WebApplicationBuilder builder)
    {
        var services = builder.Services;
        var configuration = builder.Configuration;

        var dbConnectionString = configuration.GetValue<string>("DevelopmentConfiguration:DBConnectionString");

        services.AddDbContextFactory<MyDbContext>(options => options.UseSqlServer(dbConnectionString));

        services.AddScoped<IDataBroker, ServerDataBroker>();

        //  lots more Infratructure level services         
  
        // Add any individual entity services
        // Each entity has it's own definitions 
        services.AddGroupServerInfrastructureServices();
    }
}

我的表示层服务:

public static class AppPresentationServiceCollectionExtensions
{
    public static void AddAppPresentationServices(this IServiceCollection services)
    {
        services.AddQuickGridEntityFrameworkAdapter();

        services.AddGroupPresentationServices();
        services.AddUserPresentationServices();
    }
}

最后是我的服务器Web项目:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorComponents()
    .AddServerComponents();

builder.AddAppServerInfrastructureServices();
builder.AddAppAuthServices();

builder.Services.AddAppPresentationServices();

builder.Services.AddAppUIServices();

var app = builder.Build();

相关问题