MigrationDiscovery
Discovers all classes implementing IMigration via reflection and returns them sorted by Id.
namespace Cosmigrator;
public static class MigrationDiscovery
{
public static List<IMigration> DiscoverAll(params Assembly[] assemblies);
}
Methods
| Method | Returns | Description |
|---|---|---|
DiscoverAll(params Assembly[]) | List<IMigration> | Scans assemblies for IMigration implementations, instantiates them, returns sorted by Id |
DiscoverAll
var migrations = MigrationDiscovery.DiscoverAll(Assembly.GetExecutingAssembly());
| Parameter | Type | Description |
|---|---|---|
assemblies | params Assembly[] | Assemblies to scan. If empty, defaults to Assembly.GetEntryAssembly() |
How it works
- Selects target assemblies — provided assemblies, or the entry assembly if none specified
- Scans all types using
assembly.GetTypes() - Filters to types that:
- Implement
IMigration - Are not abstract
- Are not interfaces
- Implement
- Instantiates each via
Activator.CreateInstance - Sorts by
IMigration.Id(lexicographic) - Returns as
List<IMigration>
Requirements for discovered types
- Must have a parameterless constructor (since
Activator.CreateInstanceis used) - Must be concrete (not abstract, not interface)
- Must implement
IMigration
Example
Given these classes in an assembly:
public class _20250101_000001_AddAge : IMigration { ... }
public class _20250101_000002_RemoveName : IMigration { ... }
public abstract class BaseMigration : IMigration { ... } // skipped
DiscoverAll returns:
_20250101_000001_AddAge(Id:"20250101_000001")_20250101_000002_RemoveName(Id:"20250101_000002")
BaseMigration is excluded because it's abstract.