FractalDataWorks.ServiceTypes 0.20.0-alpha.1074

This is a prerelease version of FractalDataWorks.ServiceTypes.
dotnet add package FractalDataWorks.ServiceTypes --version 0.20.0-alpha.1074
                    
NuGet\Install-Package FractalDataWorks.ServiceTypes -Version 0.20.0-alpha.1074
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="FractalDataWorks.ServiceTypes" Version="0.20.0-alpha.1074" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="FractalDataWorks.ServiceTypes" Version="0.20.0-alpha.1074" />
                    
Directory.Packages.props
<PackageReference Include="FractalDataWorks.ServiceTypes" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add FractalDataWorks.ServiceTypes --version 0.20.0-alpha.1074
                    
#r "nuget: FractalDataWorks.ServiceTypes, 0.20.0-alpha.1074"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package FractalDataWorks.ServiceTypes@0.20.0-alpha.1074
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=FractalDataWorks.ServiceTypes&version=0.20.0-alpha.1074&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=FractalDataWorks.ServiceTypes&version=0.20.0-alpha.1074&prerelease
                    
Install as a Cake Tool

FractalDataWorks.ServiceTypes

📖 Documentation: For complete implementation examples and patterns, see the ServiceTypes Framework wiki documentation.

Key Features:

  • ✅ OptionsLoader parameter controls configuration lifetime (Singleton/Scoped/Reloadable)
  • ✅ IDs auto-generated as deterministic Guids from ServiceType name
  • ✅ Public constructors for direct instantiation or collection access

See: Complete Implementation Example

A plugin architecture framework that provides type-safe service registration, discovery, and factory creation with high-performance lookups through a progressive constraint system.

Architecture Overview

The ServiceTypes framework provides a structured approach to defining and managing service types using:

  • ServiceTypeBase hierarchy - Abstract base classes for service implementations
  • IServiceType interfaces - Storage contracts with progressive generic constraints
  • ServiceTypeCollectionBase - High-performance collections with O(1) lookups
  • Attributes - Source generator integration for automatic discovery

Core Components

Dual-Purpose Interface System

The interface system serves two critical purposes:

Purpose 1: Generic Constraint Refinement

Domain-specific interfaces like IConnectionType<TService, TConfiguration, TFactory> constrain generics to specific types:

// Generic interface constrains to connection-specific types
public interface IConnectionType<TService, TConfiguration, TFactory> : IServiceType<TService, TFactory, TConfiguration>
    where TService : class, IGenericConnection              // Must be connection service
    where TConfiguration : class, IConnectionConfiguration   // Must be connection config
    where TFactory : class, IConnectionFactory<TService, TConfiguration> // Must be connection factory

// Implementation gets constrained generics
public sealed class MsSqlConnectionType : 
    ConnectionTypeBase<IGenericConnection, MsSqlConfiguration, IMsSqlConnectionFactory>,
    IConnectionType<IGenericConnection, MsSqlConfiguration, IMsSqlConnectionFactory>
Purpose 2: Type Discovery and Metadata Access

Collections store the base interface but can discover generic types, configurations, and factories:

// Store as base interface
IConnectionType connectionType = MsSqlConnectionType.Instance;

// Collection can discover the specific types
Type serviceType = connectionType.ServiceType;           // IGenericConnection
Type configurationType = connectionType.ConfigurationType; // MsSqlConfiguration  
Type factoryType = connectionType.FactoryType;           // IMsSqlConnectionFactory
string category = connectionType.Category;               // "Database"

Interface Hierarchy

IServiceType                                    // Base storage contract (Id, Name)
├── IServiceType<TService>                     // + Service type constraint
├── IServiceType<TService, TConfiguration>     // + Configuration constraint  
└── IServiceType<TService, TFactory, TConfiguration> // + Factory constraint

// Domain-specific interfaces add specific constraints
IConnectionType : IServiceType                 // Connection base
└── IConnectionType<TService, TConfiguration, TFactory> : IServiceType<TService, TFactory, TConfiguration>

ServiceTypeBase Hierarchy

ServiceTypeBase                                    // Abstract base implementation
├── ServiceTypeBase<TService>                     // + Service type
├── ServiceTypeBase<TService, TConfiguration>     // + Configuration
└── ServiceTypeBase<TService, TFactory, TConfiguration> // + Factory

ServiceTypeCollectionBase

Generic collection providing:

  • Storage: Base interfaces (IServiceType, IConnectionType)
  • Discovery: Access to generic types, configurations, factories
  • Performance: O(1) lookups by ID, name, service type, configuration type
  • Source generation: Automatic population from discovered types

Implementation Rules

Rule 1: Dual Inheritance Pattern

Every service type MUST inherit from base class AND implement interface

// ✅ CORRECT - Both base class and interface
public sealed class MsSqlConnectionType : 
    ConnectionTypeBase<IGenericConnection, MsSqlConfiguration, IMsSqlConnectionFactory>,
    IConnectionType<IGenericConnection, MsSqlConfiguration, IMsSqlConnectionFactory>,
    IConnectionType

// ❌ WRONG - Missing interface implementation
public sealed class BadConnectionType : 
    ConnectionTypeBase<IGenericConnection, MsSqlConfiguration, IMsSqlConnectionFactory>

Rule 2: Public Constructor, No Instance Property

Service types MUST have public constructors and NO Instance property

public sealed class MsSqlConnectionType : ConnectionTypeBase<...>
{
    // ✅ CORRECT - Public constructor with required parameters
    public MsSqlConnectionType() : base(
        name: "MsSql",
        sectionName: "MsSql",
        displayName: "Microsoft SQL Server",
        description: "SQL Server connection",
        optionsLoader: new SingletonOptionsLoader(),
        category: "Database")
    { }

    // ❌ WRONG - Do NOT add Instance property
    // public static MsSqlConnectionType Instance { get; } = new();
}

// ✅ CORRECT - Access via collection methods or direct instantiation
var connectionType = ConnectionTypes.ByName("MsSql");   // Via collection
var connectionType = new MsSqlConnectionType();          // Direct instantiation

Rule 3: Deterministic ID Generation

IDs are automatically generated as deterministic GUIDs from the ServiceType name

// ✅ CORRECT - IDs auto-generated from name, no manual assignment
public MsSqlConnectionType() : base(name: "MsSql", ...) { }       // ID = hash("MsSql")
public PostgreSqlConnectionType() : base(name: "PostgreSql", ...) { }  // ID = hash("PostgreSql")
public RestConnectionType() : base(name: "Rest", ...) { }          // ID = hash("Rest")

// Each ServiceType's ID is deterministic - same name always produces same GUID
// No need to track or assign IDs manually

Rule 4: Generic Type Constraints

Generic parameters MUST follow framework constraints

// ✅ CORRECT - Proper constraints for connections
public abstract class ConnectionTypeBase<TService, TConfiguration, TFactory> : 
    ServiceTypeBase<TService, TFactory, TConfiguration>
    where TService : class, IGenericConnection          // Must implement IGenericConnection
    where TConfiguration : class, IConnectionConfiguration // Must implement IConnectionConfiguration  
    where TFactory : class, IConnectionFactory<TService, TConfiguration> // Must implement factory interface

Rule 5: ServiceTypeCollection Attribute

Collections MUST use ServiceTypeCollection attribute with explicit targeting

// ✅ CORRECT - Attribute with base type, interface type, and collection type
[ServiceTypeCollection(typeof(ConnectionTypeBase<,,>), typeof(IConnectionType), typeof(ConnectionTypes))]
public partial class ConnectionTypesBase : ServiceTypeCollectionBase<...>
{
    // Source generator populates this class using explicit collection targeting
}

Rule 6: TypeLookup Attribute for Properties

Properties used for lookups MUST have TypeLookup attribute

public abstract class ServiceTypeBase
{
    // ✅ CORRECT - Generates GetByServiceType method
    [TypeLookup("GetByServiceType")]
    public abstract Type ServiceType { get; }
    
    // ✅ CORRECT - Generates GetByConfigurationType method  
    [TypeLookup("GetByConfigurationType")]
    public abstract Type ConfigurationType { get; }
}

Rule 7: Required Abstract Method Implementations

Service types MUST implement all abstract methods

public sealed class MsSqlConnectionType : ConnectionTypeBase<...>
{
    // ✅ REQUIRED - Configuration section name
    public override string SectionName => "MsSql";
    
    // ✅ REQUIRED - Display name for UI
    public override string DisplayName => "Microsoft SQL Server";
    
    // ✅ REQUIRED - Description of capabilities
    public override string Description => "High-performance connection to Microsoft SQL Server databases with query translation and connection pooling.";
    
    // ✅ REQUIRED - Register services with DI container
    public override void Register(IServiceCollection services)
    {
        services.AddScoped<IMsSqlConnectionFactory, MsSqlConnectionFactory>();
        services.AddScoped<MsSqlService>();
        services.AddScoped<MsSqlCommandTranslator>();
    }
    
    // ✅ REQUIRED - Configure service at startup
    public override void Configure(IConfiguration configuration)
    {
        // Validate connection strings, configure pools, etc.
    }
}

Rule 8: ServiceTypeOption Attribute for Explicit Collection Targeting

Service type options MUST use ServiceTypeOption attribute with explicit collection targeting

// ✅ CORRECT - Attribute with explicit collection type and name
[ServiceTypeOption(typeof(ConnectionTypes), "MsSql")]
public sealed class MsSqlConnectionType :
    ConnectionTypeBase<IGenericConnection, MsSqlConfiguration, IMsSqlConnectionFactory>,
    IConnectionType<IGenericConnection, MsSqlConfiguration, IMsSqlConnectionFactory>
{
    public MsSqlConnectionType() : base(
        name: "MsSql",
        sectionName: "MsSql",
        displayName: "Microsoft SQL Server",
        description: "SQL Server connection",
        optionsLoader: new SingletonOptionsLoader(),
        category: "Database")
    { }
    // ... implementation
}

// ❌ WRONG - Missing ServiceTypeOption attribute
public sealed class BadConnectionType : ConnectionTypeBase<...>
{
    // Missing: [ServiceTypeOption(typeof(ConnectionTypes), "BadConnection")]
}

Performance Benefits:

  • O(types_with_attribute) vs O(collections × assemblies × all_types) discovery
  • Eliminates expensive inheritance scanning across all assemblies
  • Direct collection type targeting for faster source generation

Rule 9: OptionsLoader Parameter

Service types MUST provide OptionsLoader parameter to control configuration lifetime

// ✅ CORRECT - Provides optionsLoader parameter
[ServiceTypeOption(typeof(ConnectionTypes), "MsSql")]
public sealed class MsSqlConnectionType : ConnectionTypeBase<...>
{
    public MsSqlConnectionType() : base(
        name: "MsSql",
        sectionName: "MsSql",
        displayName: "Microsoft SQL Server",
        description: "SQL Server connection",
        optionsLoader: new SingletonOptionsLoader(),  // REQUIRED
        category: "Database"
        factoryOptions: new FactoryOptions { ... },
        registrationOptions: new ConnectionRegistrationOptions { ... })
    {
    }
}

// ❌ WRONG - Missing optionsLoader parameter (v0.7.0 pattern, deprecated)
public MsSqlConnectionType() : base(
    id: 2,
    name: "MsSql",
    category: "Database",
    // Missing: optionsLoader parameter
    factoryOptions: new FactoryOptions { ... },
    registrationOptions: new ConnectionRegistrationOptions { ... })
{
}

The Three OptionsLoader Types:

Loader IOptions Interface When to Use Performance
SingletonOptionsLoader IOptions<T> Config never changes Fastest (0% overhead)
ScopedOptionsLoader (default) IOptionsSnapshot<T> Multi-tenant, per-request config Low (5-10% overhead)
ReloadableOptionsLoader IOptionsMonitor<T> Database config, hot reload Moderate (15-20% overhead)

Collection-Level Defaults:

Set default loader for all ServiceTypes in a collection using DefaultOptionsLoader attribute property:

[ServiceTypeCollection(
    typeof(ConnectionTypeBase<,,>),
    typeof(IConnectionType),
    typeof(ConnectionTypes),
    DefaultOptionsLoader = "Reloadable")]  // All connections use IOptionsMonitor
public partial class ConnectionTypesBase : ServiceTypeCollectionBase<...>
{
}

ServiceType-Level Overrides:

Override collection default for specific ServiceTypes:

// Collection default is Scoped
[ServiceTypeCollection(..., DefaultOptionsLoader = "Scoped")]
public partial class ConnectionTypesBase : ...

// MsSql overrides to Singleton for best performance
[ServiceTypeOption(typeof(ConnectionTypes), "MsSql")]
public sealed class MsSqlConnectionType : ConnectionTypeBase<...>
{
    public MsSqlConnectionType() : base(
        // ...
        optionsLoader: new SingletonOptionsLoader(),  // Override collection default
        // ...
    )
}

Decision Guide:

Configuration Source Recommended Loader
appsettings.json (static) SingletonOptionsLoader
appsettings.json (file-watched) ReloadableOptionsLoader
Database configuration ReloadableOptionsLoader
Multi-tenant config ScopedOptionsLoader
Environment variables SingletonOptionsLoader

See Also: Options Loader Configuration for complete guide.

Complete Example: SQL Server Connection Service

Project Structure

FractalDataWorks.Services.Connections.Abstractions/
├── ConnectionTypeBase.cs           (Rule 1: Base class)
├── ConnectionTypeCollectionBase.cs (Rule 5: Collection base)
├── IConnectionType.cs             (Rule 1: Interface contract)
└── ConnectionTypesBase.cs         (Rule 5: Concrete collection)

FractalDataWorks.Services.Connections.MsSql/
├── MsSqlConnectionType.cs         (Rule 1-7: Complete implementation)
├── MsSqlConfiguration.cs          (Rule 4: Configuration constraint)
├── IMsSqlConnectionFactory.cs     (Rule 4: Factory constraint)
└── MsSqlService.cs               (Rule 4: Service constraint)

1. Abstract Base Class (in Abstractions project)

// ConnectionTypeBase.cs - Rule 1 & 4: Base class with constraints
using FractalDataWorks.ServiceTypes;

namespace FractalDataWorks.Services.Connections.Abstractions;

public abstract class ConnectionTypeBase<TService, TConfiguration, TFactory> :
    ServiceTypeBase<TService, TFactory, TConfiguration>,    // Rule 1: Inherit base class
    IConnectionType<TService, TConfiguration, TFactory>,    // Rule 1: Implement generic interface
    IConnectionType                                         // Rule 1: Implement non-generic interface
    where TService : class, IGenericConnection              // Rule 4: Service constraint
    where TConfiguration : class, IConnectionConfiguration   // Rule 4: Configuration constraint
    where TFactory : class, IConnectionFactory<TService, TConfiguration> // Rule 4: Factory constraint
{
    protected ConnectionTypeBase(
        string name,
        string sectionName,
        string displayName,
        string description,
        OptionsLoaderBase optionsLoader,
        string? category = null)
        : base(name, sectionName, displayName, description, optionsLoader, category ?? "Connection")
    {
    }
}

2. Collection Base (in Abstractions project)

// ConnectionTypeCollectionBase.cs - Rule 5: Collection with attribute
using FractalDataWorks.ServiceTypes;
using FractalDataWorks.ServiceTypes.Attributes;

namespace FractalDataWorks.Services.Connections.Abstractions;

[ServiceTypeCollection(typeof(ConnectionTypeBase<,,>), typeof(IConnectionType), typeof(ConnectionTypes))]  // Rule 5: Collection attribute
public partial class ConnectionTypesBase : 
    ConnectionTypeCollectionBase<
        ConnectionTypeBase<IGenericConnection, IConnectionConfiguration, IConnectionFactory<IGenericConnection, IConnectionConfiguration>>,
        ConnectionTypeBase<IGenericConnection, IConnectionConfiguration, IConnectionFactory<IGenericConnection, IConnectionConfiguration>>,
        IGenericConnection,
        IConnectionConfiguration,
        IConnectionFactory<IGenericConnection, IConnectionConfiguration>>
{
    // Source generator will populate with discovered connection types
}

3. Concrete Implementation (in MsSql project)

// MsSqlConnectionType.cs - Rules 1-9: Complete implementation
using FractalDataWorks.Services.Connections.Abstractions;
using FractalDataWorks.ServiceTypes.Attributes;

namespace FractalDataWorks.Services.Connections.MsSql;

[ServiceTypeOption(typeof(ConnectionTypes), "MsSql")]                                   // Rule 8: ServiceTypeOption with collection targeting
public sealed class MsSqlConnectionType :
    ConnectionTypeBase<IGenericConnection, MsSqlConfiguration, IMsSqlConnectionFactory>, // Rule 1: Base class
    IConnectionType<IGenericConnection, MsSqlConfiguration, IMsSqlConnectionFactory>,    // Rule 1: Generic interface
    IConnectionType                                                                      // Rule 1: Non-generic interface
{
    public MsSqlConnectionType() : base(                                                 // Rule 2 & 3: Public constructor
        name: "MsSql",
        sectionName: "MsSql",
        displayName: "Microsoft SQL Server",
        description: "SQL Server database connection",
        optionsLoader: new SingletonOptionsLoader(),                                     // Rule 9: OptionsLoader for config lifetime
        category: "Database"
        factoryOptions: new FactoryOptions { ... },
        registrationOptions: new ConnectionRegistrationOptions { ... })
    {
    }
    
    // Rule 7: Required property implementations
    public override string SectionName => "MsSql";
    public override string DisplayName => "Microsoft SQL Server";  
    public override string Description => "High-performance connection to Microsoft SQL Server databases.";
    
    // Rule 7: Required method implementations
    public override void Register(IServiceCollection services)
    {
        services.AddScoped<IMsSqlConnectionFactory, MsSqlConnectionFactory>();
        services.AddScoped<MsSqlService>();
    }
    
    public override void Configure(IConfiguration configuration)
    {
        // SQL Server specific configuration
    }
}

4. Supporting Types (in MsSql project)

// MsSqlConfiguration.cs - Rule 4: Configuration constraint satisfaction
public sealed class MsSqlConfiguration : IConnectionConfiguration
{
    public string ConnectionString { get; set; } = string.Empty;
    public int CommandTimeout { get; set; } = 30;
}

// IMsSqlConnectionFactory.cs - Rule 4: Factory constraint satisfaction
public interface IMsSqlConnectionFactory : IConnectionFactory<IGenericConnection, MsSqlConfiguration>
{
    // SQL Server specific factory methods
}

Usage Examples

Interface-Based Storage and Constraints

// Store as base interface for polymorphic collections
IConnectionType connectionType = new MsSqlConnectionType();
List<IConnectionType> allConnections = new() { connectionType };

// Use constrained interface for type-safe operations
public void ConfigureConnection<T>(IConnectionType<IGenericConnection, T, IConnectionFactory<IGenericConnection, T>> connectionType)
    where T : class, IConnectionConfiguration
{
    // Compiler guarantees T is IConnectionConfiguration
    // Can safely cast connectionType.ConfigurationType to typeof(T)
}

// Interface enables dependency injection without concrete types
public class ConnectionManager
{
    private readonly IConnectionType _connectionType;
    
    public ConnectionManager(IConnectionType connectionType)  // Inject interface, not concrete type
    {
        _connectionType = connectionType;
    }
    
    public void CreateConnection()
    {
        // Access discovered metadata through interface
        var factoryType = _connectionType.FactoryType;        // IMsSqlConnectionFactory
        var configType = _connectionType.ConfigurationType;   // MsSqlConfiguration
        var factory = serviceProvider.GetService(factoryType);
    }
}

Service Registration

// Register all connection types discovered by source generator
services.AddServiceTypes<ConnectionTypesBase>();

// Register specific connection type
var msSqlType = new MsSqlConnectionType();
msSqlType.Register(services);

// Or via collection
var msSqlType = ConnectionTypes.ByName("MsSql");
msSqlType.Register(services);

// Register by interface for dependency injection
services.AddSingleton<IConnectionType>(new MsSqlConnectionType());

Service Discovery Through Collections

// Get all connection types as interfaces
IReadOnlyList<IConnectionType> connectionTypes = ConnectionTypes.All;

// Get specific connection type by ID
IConnectionType sqlServer = ConnectionTypes.GetById(2);

// Get connection type by name  
IConnectionType sqlServer = ConnectionTypes.GetByName("MsSql");

// Discover types at runtime through interface metadata
foreach (var connectionType in connectionTypes)
{
    Type serviceType = connectionType.ServiceType;           // What service it provides
    Type configType = connectionType.ConfigurationType;     // What config it needs  
    Type factoryType = connectionType.FactoryType;          // What factory creates it
    string category = connectionType.Category;              // How it's categorized
    
    // Use reflection to create instances based on discovered metadata
    var factory = serviceProvider.GetService(factoryType);
    var config = configuration.GetSection(connectionType.SectionName).Get(configType);
}

Configuration Binding with Interface Metadata

// appsettings.json
{
  "MsSql": {
    "ConnectionString": "...",
    "CommandTimeout": 60
  }
}

// Bind configuration using interface metadata discovery
public void ConfigureFromInterface(IConnectionType connectionType)
{
    var sectionName = connectionType.SectionName;           // "MsSql"  
    var configurationType = connectionType.ConfigurationType; // typeof(MsSqlConfiguration)
    
    // Dynamic configuration binding based on discovered metadata
    var configSection = configuration.GetSection(sectionName);
    var configInstance = configSection.Get(configurationType);
    
    // Type-safe casting because interface contract guarantees compatibility
    if (configInstance is IConnectionConfiguration connectionConfig)
    {
        // Use the configuration
    }
}

Rule Violations and Common Mistakes

❌ Missing Interface Implementation

// WRONG - Only inherits base class
public sealed class BadType : ServiceTypeBase<IService, Factory, Config>
{
    // Missing: , IServiceType<IService, Factory, Config>, IServiceType
}

❌ Using Instance Property (Old Pattern)

// WRONG - Instance property is not used for TypeOptions/ServiceTypes
public sealed class BadType : ServiceTypeBase<...>
{
    public static BadType Instance { get; } = new();  // ❌ Don't do this
    private BadType() : base(1, "Bad") { }
}

// CORRECT - Public constructor, no Instance property
public sealed class GoodType : ServiceTypeBase<...>
{
    public GoodType() : base(1, "Good") { }  // ✅ Public constructor
}

❌ Missing Required Attributes

// WRONG - Missing ServiceTypeCollection attribute
public partial class BadCollection : ServiceTypeCollectionBase<...>
{
    // Missing: [ServiceTypeCollection(typeof(SomeTypeBase<,,>), typeof(ISomeType), typeof(SomeTypes))]
}

// WRONG - Missing ServiceTypeOption attribute
public sealed class BadServiceType : ServiceTypeBase<...>
{
    // Missing: [ServiceTypeOption(typeof(SomeTypes), "BadService")]
}

❌ Constraint Violations

// WRONG - Service doesn't implement required interface
public sealed class BadConnection : 
    ConnectionTypeBase<SomeService, Config, Factory>  // SomeService must implement IGenericConnection

Source Generator Integration

The framework uses source generators to automatically:

  1. Discover Service Types - Find all classes inheriting from ServiceTypeBase
  2. Generate Collections - Create high-performance FrozenDictionary lookups
  3. Generate Lookup Methods - Create methods based on TypeLookup attributes
  4. Validate Rules - Ensure all rules are followed at compile-time

Best Practices

  1. One Service Type Per File - Keep service type definitions focused
  2. Descriptive Categories - Use meaningful category names for organization
  3. Comprehensive Registration - Register all required services in Register method
  4. Validation in Configure - Validate configurations and fail fast
  5. Consistent Naming - Use consistent naming patterns across service types
  6. Documentation - Provide clear descriptions of capabilities and use cases
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (23)

Showing the top 5 NuGet packages that depend on FractalDataWorks.ServiceTypes:

Package Downloads
FractalDataWorks.Services

Development tools and utilities for the FractalDataWorks ecosystem. Build:

FractalDataWorks.Services.Transformations.Abstractions

Development tools and utilities for the FractalDataWorks ecosystem. Build:

FractalDataWorks.Services.Scheduling.Abstractions

Development tools and utilities for the FractalDataWorks ecosystem. Build:

FractalDataWorks.Services.Connections.Abstractions

Development tools and utilities for the FractalDataWorks ecosystem. Build:

FractalDataWorks.Data.Abstractions

Development tools and utilities for the FractalDataWorks ecosystem. Build:

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.20.0-alpha.1074 367 12/10/2025
0.20.0-alpha.1062 385 12/9/2025
0.20.0-alpha.1058 375 12/8/2025
0.20.0-alpha.1048 117 12/5/2025
0.20.0-alpha.1047 124 12/5/2025
0.20.0-alpha.1045 154 12/5/2025
0.20.0-alpha.1044 161 12/5/2025
0.10.1-alpha.1024 620 12/3/2025
0.10.1-alpha.1023 622 12/3/2025
0.10.1-alpha.1022 624 12/3/2025
0.10.1-alpha.1020 626 12/3/2025
0.10.1-alpha.1019 628 12/3/2025
0.10.1-alpha.1004 654 12/2/2025
0.10.1-alpha.1002 636 12/2/2025
0.10.1-alpha.1001 636 12/2/2025
0.9.5-alpha.1038 456 12/1/2025
0.9.5-alpha.1037 390 12/1/2025
0.9.5-alpha.1008 135 11/25/2025
0.9.5-alpha.1007 148 11/25/2025
0.9.5-alpha.1006 221 11/25/2025
0.9.1-alpha.1037 145 11/25/2025
0.9.1-alpha.1036 150 11/25/2025
0.9.1-alpha.1035 153 11/25/2025
0.9.1-alpha.1033 148 11/25/2025
0.9.0-alpha.1011.ged0a6c6e98 377 11/18/2025
0.9.0-alpha.1010.gecd88aac50 370 11/18/2025
0.9.0-alpha.1009.g7f6817e985 375 11/18/2025
0.9.0-alpha.1006.gf287016c0c 406 11/18/2025
0.8.0-alpha.1011 368 11/18/2025
0.7.0-alpha.1022 158 11/3/2025
0.7.0-alpha.1021 175 11/3/2025
0.7.0-alpha.1008 122 11/2/2025
0.7.0-alpha.1006 142 10/30/2025
0.7.0-alpha.1005 144 10/30/2025
0.7.0-alpha.1004 142 10/30/2025
0.7.0-alpha.1001 148 10/29/2025
0.6.0-alpha.1006 139 10/29/2025
0.6.0-alpha.1005 150 10/28/2025
0.6.0-alpha.1004 140 10/28/2025
0.6.0-alpha.1002 133 10/28/2025