logo SERENITY
Game Systems Foundation
Search Results for

    Show / Hide Table of Contents

    Class ExtensionPointDescriptor

    Immutable snapshot of one discovered Serenity extension point, as produced by Discover(). For Service this simply wraps an AggregateDescriptor (see FromAggregate(AggregateDescriptor)) so AggregateCatalog and its tests keep working unchanged; every other kind is built directly from reflection over the matching contract type.

    Inheritance
    object
    ExtensionPointDescriptor
    Inherited Members
    object.ToString()
    object.Equals(object)
    object.Equals(object, object)
    object.ReferenceEquals(object, object)
    object.GetHashCode()
    object.GetType()
    Namespace: Serenity.ServiceExtensionCreator.Editor
    Assembly: Serenity.ServiceExtensionCreator.Editor.dll
    Syntax
    public sealed class ExtensionPointDescriptor

    Constructors

    ExtensionPointDescriptor(ExtensionPointKind, string, string, Type, Type, bool, WiringCapability, IReadOnlyList<MemberInfo>, AggregateDescriptor, Type, MethodInfo, string, IReadOnlyList<Type>, bool)

    Declaration
    public ExtensionPointDescriptor(ExtensionPointKind kind, string name, string moduleName, Type contractType, Type concreteType, bool concreteHasVirtualMembers, WiringCapability wiringCapability, IReadOnlyList<MemberInfo> contractMembers, AggregateDescriptor underlyingAggregate = null, Type installerType = null, MethodInfo installerHookMethod = null, string discoveryWarning = null, IReadOnlyList<Type> eligibleSubclassBases = null, bool requiresVirtualization = false)
    Parameters
    Type Name Description
    ExtensionPointKind kind
    string name
    string moduleName
    Type contractType
    Type concreteType
    bool concreteHasVirtualMembers
    WiringCapability wiringCapability
    IReadOnlyList<MemberInfo> contractMembers
    AggregateDescriptor underlyingAggregate
    Type installerType
    MethodInfo installerHookMethod
    string discoveryWarning
    IReadOnlyList<Type> eligibleSubclassBases
    bool requiresVirtualization

    Properties

    ConcreteAssemblyName

    Assembly hosting ConcreteType, or null when unresolved.

    Declaration
    public string ConcreteAssemblyName { get; }
    Property Value
    Type Description
    string

    ConcreteHasVirtualMembers

    True when ConcreteType declares at least one public (or, for Installer, protected) virtual member — the Subclass generation style's prerequisite.

    Declaration
    public bool ConcreteHasVirtualMembers { get; }
    Property Value
    Type Description
    bool

    ConcreteType

    The reference concrete implementation used for the Subclass generation style, or null when none was found. For the Installer kind this equals ContractType itself — the abstract PersistenceInstaller is both the contract and the type a generated backend subclasses directly.

    Declaration
    public Type ConcreteType { get; }
    Property Value
    Type Description
    Type

    ContractAssemblyName

    Assembly hosting ContractType.

    Declaration
    public string ContractAssemblyName { get; }
    Property Value
    Type Description
    string

    ContractMembers

    Every public member of ContractType, used to generate stub/forwarding/override members.

    Declaration
    public IReadOnlyList<MemberInfo> ContractMembers { get; }
    Property Value
    Type Description
    IReadOnlyList<MemberInfo>

    ContractType

    The port this extension point extends — an interface for every kind except Installer, which targets the abstract PersistenceInstaller class directly.

    Declaration
    public Type ContractType { get; }
    Property Value
    Type Description
    Type

    DiscoveryWarning

    A human-readable warning produced during discovery (e.g. an ambiguous installer or hook lookup that was skipped rather than silently first-picked), for the wizard window and generated README to surface. Null when discovery was unambiguous.

    Declaration
    public string DiscoveryWarning { get; }
    Property Value
    Type Description
    string

    EligibleSubclassBases

    Every public, non-abstract, non-test-assembly implementer of ContractType with overridable public or protected members — each one a valid base for the InfrastructureSubclass style, canonical reference concrete first. Empty when nothing subclassable exists, and always empty for the Installer kind (it subclasses the abstract PersistenceInstaller through its own dedicated path).

    Declaration
    public IReadOnlyList<Type> EligibleSubclassBases { get; }
    Property Value
    Type Description
    IReadOnlyList<Type>

    InstallerAssemblyName

    Assembly hosting InstallerType, or null when unresolved.

    Declaration
    public string InstallerAssemblyName { get; }
    Property Value
    Type Description
    string

    InstallerHookMethod

    The discovered protected virtual Create* hook on InstallerType a generated wiring subclass overrides, when WiringCapability is InstallerHook.

    Declaration
    public MethodInfo InstallerHookMethod { get; }
    Property Value
    Type Description
    MethodInfo

    InstallerType

    The aggregate's Unity{X}Installer hosting InstallerHookMethod, for Repository/Gateway kinds — present even when no matching hook was found, so a generated README can still name the installer a hook should be added to.

    Declaration
    public Type InstallerType { get; }
    Property Value
    Type Description
    Type

    Kind

    Which extension point kind this descriptor represents.

    Declaration
    public ExtensionPointKind Kind { get; }
    Property Value
    Type Description
    ExtensionPointKind

    ModuleName

    The business module this extension point belongs to (e.g. "Persistence", "Score"), resolved from ContractType's namespace.

    Declaration
    public string ModuleName { get; }
    Property Value
    Type Description
    string

    Name

    The extension point's identity within its Kind — the aggregate name for Service (e.g. "Score"), or the contract type name with its leading "I" stripped for every other kind (e.g. "BlobStore", "ScoreRepository", "AudioPlayerGateway").

    Declaration
    public string Name { get; }
    Property Value
    Type Description
    string

    RequiresVirtualization

    True for a Class-kind user class that is NOT subclassable yet — no public or protected virtual methods, but at least one patchable public or protected instance method (see DiscoverVirtualizableUserClasses()). Generation against such a descriptor is always rejected; the wizard routes it to a member-selection virtualization step instead of the style step. False for every other descriptor.

    Declaration
    public bool RequiresVirtualization { get; }
    Property Value
    Type Description
    bool

    UnderlyingAggregate

    The wrapped AggregateDescriptor for Service; null for every other kind.

    Declaration
    public AggregateDescriptor UnderlyingAggregate { get; }
    Property Value
    Type Description
    AggregateDescriptor

    WiringCapability

    How a generated implementation of this extension point is naturally wired into the game.

    Declaration
    public WiringCapability WiringCapability { get; }
    Property Value
    Type Description
    WiringCapability

    Methods

    FromAggregate(AggregateDescriptor)

    Adapts an AggregateDescriptor into the shared ExtensionPointDescriptor shape — the Service kind's natural wiring is PipelineReplace for a core-installed aggregate and AutoRegister otherwise, though Wiring remains a free user choice for this kind regardless of this hint. A user-authored aggregate (IsUserDefined) is grouped under one "User" module in the wizard instead of its own aggregate name, since it has no Serenity package module to group by.

    Declaration
    public static ExtensionPointDescriptor FromAggregate(AggregateDescriptor aggregate)
    Parameters
    Type Name Description
    AggregateDescriptor aggregate
    Returns
    Type Description
    ExtensionPointDescriptor
    In this article
    © 2026 Serenity. All Rights Reserved