using Inversion; /** * Basic Usage Example * * This example demonstrates the fundamental features of the Inversion IoC container: * - Registering types with different lifecycles * - Resolving dependencies * - Using the type-safe resolve methods */ public class BasicUsageExample : Object { // Define a simple service interface public interface ILogger : Object { public abstract void log(string message); } // Console logger implementation public class ConsoleLogger : Object, ILogger { public void log(string message) { stdout.printf("[LOG] %s\n", message); } } // A service that depends on ILogger public class UserService : Object { private ILogger logger; public UserService(ILogger logger) { this.logger = logger; } public void greet(string name) { this.logger.log(@"Hello, $name!"); } } public static int main(string[] args) { stdout.printf("=== Inversion IoC Basic Usage Example ===\n\n"); // Create the container var container = new Container(); // Register the logger as a singleton with a factory delegate container.register_singleton((scope) => new ConsoleLogger()) .as_type(typeof(ILogger)); stdout.printf("Registered ConsoleLogger as ILogger (Singleton)\n\n"); // Create a scope var scope = container.create_scope(); // Resolve the logger using type-safe method try { var logger = scope.resolve(); logger.log("Logger resolved successfully!"); // Resolve again to demonstrate singleton behavior var logger2 = scope.resolve(); logger2.log("Second resolution - same instance!"); // Verify they are the same instance if (logger == logger2) { stdout.printf("\n✓ Singleton working: Both references point to the same instance\n"); } } catch (Error e) { stderr.printf("Error: %s\n", e.message); return 1; } stdout.printf("\n=== Example Complete ===\n"); return 0; } }