解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
大石头 authored at 2018-05-15 21:21:05
9.88 KiB
X
# ²å¼þ¿ò¼Ü IPlugin ## ¸ÅÊö `IPlugin` ÊÇ NewLife.Core ÖеÄͨÓòå¼þ½Ó¿Ú£¬ÅäºÏ `PluginManager` ²å¼þ¹ÜÀíÆ÷£¬¿ÉÒÔ¿ìËÙ¹¹½¨Ò»¸ö¼òµ¥Í¨ÓõIJå¼þϵͳ¡£Ö§³Ö²å¼þ·¢ÏÖ¡¢¼ÓÔØ¡¢³õʼ»¯ºÍ×ÊÔ´ÊͷŵÈÍêÕûÉúÃüÖÜÆÚ¹ÜÀí¡£ **ÃüÃû¿Õ¼ä**£º`NewLife.Model` **ÎĵµµØÖ·**£ºhttps://newlifex.com/core/plugin ## ºËÐÄÌØÐÔ - **×Ô¶¯·¢ÏÖ**£ºÉ¨Ãè³ÌÐò¼¯×Ô¶¯·¢ÏÖ `IPlugin` ʵÏÖ - **ËÞÖ÷ʶ±ð**£ºÍ¨¹ý `PluginAttribute` ±ê¼Ç²å¼þËùÊôËÞÖ÷ - **ÒÀÀµ×¢Èë**£ºÖ§³Ö´Ó `IServiceProvider` ʵÀý»¯²å¼þ - **ÉúÃüÖÜÆÚ**£ºÖ§³Ö³õʼ»¯ºÍÏú»Ù»Øµ÷ - **µ¹ÐòÏú»Ù**£º°´¼ÓÔØµÄ·´Ïò˳ÐòÊÍ·Å×ÊÔ´ ## ¿ìËÙ¿ªÊ¼ ### ¶¨Òå²å¼þ ```csharp using NewLife.Model; // ²å¼þʵÏÖ [Plugin("MyApp")] // ±ê¼ÇÖ§³ÖµÄËÞÖ÷ public class MyPlugin : IPlugin { public Boolean Init(String? identity, IServiceProvider provider) { if (identity != "MyApp") return false; // ·ÇÄ¿±êËÞÖ÷ Console.WriteLine("MyPlugin ³õʼ»¯³É¹¦"); return true; } } ``` ### ¼ÓÔØ²å¼þ ```csharp using NewLife.Model; // ´´½¨²å¼þ¹ÜÀíÆ÷ var manager = new PluginManager { Identity = "MyApp", Provider = ObjectContainer.Provider }; // ¼ÓÔØ²¢³õʼ»¯²å¼þ manager.Load(); manager.Init(); // ʹÓòå¼þ foreach (var plugin in manager.Plugins) { Console.WriteLine($"ÒѼÓÔØ²å¼þ: {plugin.GetType().Name}"); } // ÊÍ·Å×ÊÔ´ manager.Dispose(); ``` ## API ²Î¿¼ ### IPlugin ½Ó¿Ú ```csharp public interface IPlugin { /// <summary>³õʼ»¯</summary> /// <param name="identity">²å¼þËÞÖ÷±êʶ</param> /// <param name="provider">·þÎñÌṩÕß</param> /// <returns>·µ»Ø³õʼ»¯ÊÇ·ñ³É¹¦</returns> Boolean Init(String? identity, IServiceProvider provider); } ``` **²ÎÊý˵Ã÷**£º - `identity`£ºËÞÖ÷±êʶ£¬ÓÃÓÚ²å¼þÅжÏÊÇ·ñΪĿ±êËÞÖ÷ - `provider`£º·þÎñÌṩÕߣ¬ÓÃÓÚ»ñÈ¡ÒÀÀµ·þÎñ **·µ»ØÖµ**£º - `true`£º³õʼ»¯³É¹¦£¬±£Áô¸Ã²å¼þ - `false`£º·ÇÄ¿±êËÞÖ÷»ò³õʼ»¯Ê§°Ü£¬ÒƳý¸Ã²å¼þ ### PluginAttribute ÌØÐÔ ```csharp [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] public class PluginAttribute : Attribute { public String Identity { get; set; } } ``` ÓÃÓÚ±ê¼Ç²å¼þÖ§³ÖµÄËÞÖ÷±êʶ¡£ **ʾÀý**£º ```csharp // Ö§³Öµ¥¸öËÞÖ÷ [Plugin("WebServer")] public class WebPlugin : IPlugin { } // Ö§³Ö¶à¸öËÞÖ÷ [Plugin("WebServer")] [Plugin("ApiServer")] public class MultiHostPlugin : IPlugin { } ``` ### PluginManager Àà #### ÊôÐÔ ```csharp /// <summary>ËÞÖ÷±êʶ</summary> public String? Identity { get; set; } /// <summary>ËÞÖ÷·þÎñÌṩÕß</summary> public IServiceProvider? Provider { get; set; } /// <summary>²å¼þ¼¯ºÏ</summary> public IPlugin[]? Plugins { get; set; } /// <summary>ÈÕÖ¾ÌṩÕß</summary> public ILog Log { get; set; } ``` #### Load - ¼ÓÔØ²å¼þ ```csharp public void Load() ``` ɨÃèËùÓгÌÐò¼¯£¬¼ÓÔØÊµÏÖ `IPlugin` ½Ó¿ÚµÄÀàÐÍ¡£ **¼ÓÔØ¹æÔò**£º 1. ɨÃèËùÓÐÒѼÓÔØµÄ³ÌÐò¼¯ 2. ²éÕÒʵÏÖ `IPlugin` µÄ·Ç³éÏóÀà 3. ¼ì²é `PluginAttribute`£¬¹ýÂ˷ǵ±Ç°ËÞÖ÷µÄ²å¼þ 4. ͨ¹ý·þÎñÌṩÕß»ò·´ÉäʵÀý»¯ #### Init - ³õʼ»¯²å¼þ ```csharp public void Init() ``` ÒÀ´Îµ÷ÓÃÿ¸ö²å¼þµÄ `Init` ·½·¨£¬ÒƳý³õʼ»¯Ê§°ÜµÄ²å¼þ¡£ #### LoadPlugins - »ñÈ¡²å¼þÀàÐÍ ```csharp public IEnumerable<Type> LoadPlugins() ``` ½ö»ñÈ¡²å¼þÀàÐÍ£¬²»ÊµÀý»¯¡£ÊÊÓÃÓÚÐèÒª×Ô¶¨ÒåʵÀý»¯Âß¼­µÄ³¡¾°¡£ ## ²å¼þÉúÃüÖÜÆÚ ``` 1. ËÞÖ÷´´½¨ PluginManager 2. µ÷Óà Load() - ·¢ÏÖ²¢ÊµÀý»¯²å¼þ 3. µ÷Óà Init() - ³õʼ»¯²å¼þ 4. ²å¼þÔËÐÐÆÚ... 5. µ÷Óà Dispose() - µ¹ÐòÏú»Ù²å¼þ ``` ### ÉúÃüÖÜÆÚʾÀý ```csharp public class LifecyclePlugin : IPlugin, IDisposable { private ILogger? _logger; // ¹¹Ô캯Êý£ºËÞÖ÷¼ÓÔØ²å¼þʱµ÷Óà public LifecyclePlugin() { Console.WriteLine("1. ¹¹Ô캯Êý±»µ÷ÓÃ"); } // ³õʼ»¯£ºËÞÖ÷×¼±¸¾ÍÐ÷ºóµ÷Óà public Boolean Init(String? identity, IServiceProvider provider) { Console.WriteLine("2. Init ±»µ÷ÓÃ"); // »ñÈ¡ÒÀÀµ _logger = provider.GetService<ILogger>(); _logger?.Info("²å¼þ³õʼ»¯"); return true; } // Ïú»Ù£ºËÞÖ÷ÊÍ·Åʱµ÷Óà public void Dispose() { Console.WriteLine("3. Dispose ±»µ÷ÓÃ"); _logger?.Info("²å¼þÏú»Ù"); } } ``` ## ʹÓó¡¾° ### 1. ¹¦ÄÜÀ©Õ¹²å¼þ ```csharp // ¶¨ÒåÀ©Õ¹µã½Ó¿Ú public interface IDataProcessor { String Name { get; } void Process(Object data); } // ²å¼þʵÏÖ [Plugin("DataPipeline")] public class JsonProcessor : IPlugin, IDataProcessor { public String Name => "JSON´¦ÀíÆ÷"; public Boolean Init(String? identity, IServiceProvider provider) { return identity == "DataPipeline"; } public void Process(Object data) { var json = data.ToJson(); Console.WriteLine($"´¦ÀíJSON: {json}"); } } // ËÞÖ÷ʹÓà var manager = new PluginManager { Identity = "DataPipeline" }; manager.Load(); manager.Init(); foreach (var plugin in manager.Plugins.OfType<IDataProcessor>()) { plugin.Process(myData); } ``` ### 2. ʼþ¼àÌý²å¼þ ```csharp public interface IEventListener { void OnEvent(String eventName, Object? args); } [Plugin("EventSystem")] public class LoggingPlugin : IPlugin, IEventListener { private ILog? _log; public Boolean Init(String? identity, IServiceProvider provider) { _log = provider.GetService<ILog>(); return identity == "EventSystem"; } public void OnEvent(String eventName, Object? args) { _log?.Info($"ʼþ: {eventName}, ²ÎÊý: {args}"); } } // ʼþ·Ö·¢ public class EventDispatcher { private readonly IEventListener[] _listeners; public EventDispatcher(PluginManager manager) { _listeners = manager.Plugins?.OfType<IEventListener>().ToArray() ?? []; } public void Dispatch(String eventName, Object? args = null) { foreach (var listener in _listeners) { listener.OnEvent(eventName, args); } } } ``` ### 3. Ä£¿é»¯Ó¦Óà ```csharp // Ä£¿é½Ó¿Ú public interface IModule { String Name { get; } void Configure(IObjectContainer container); void Start(); void Stop(); } // Óû§Ä£¿é [Plugin("MainApp")] public class UserModule : IPlugin, IModule, IDisposable { public String Name => "Óû§Ä£¿é"; public Boolean Init(String? identity, IServiceProvider provider) { return identity == "MainApp"; } public void Configure(IObjectContainer container) { container.AddTransient<IUserService, UserService>(); container.AddTransient<IUserRepository, UserRepository>(); } public void Start() { XTrace.WriteLine($"{Name} ÒÑÆô¶¯"); } public void Stop() { XTrace.WriteLine($"{Name} ÒÑÍ£Ö¹"); } public void Dispose() => Stop(); } // Ö÷³ÌÐò class Program { static void Main() { var ioc = ObjectContainer.Current; var manager = new PluginManager { Identity = "MainApp", Provider = ioc.BuildServiceProvider() }; manager.Load(); manager.Init(); // ÅäÖÃÄ£¿é foreach (var module in manager.Plugins.OfType<IModule>()) { module.Configure(ioc); } // Æô¶¯Ä£¿é foreach (var module in manager.Plugins.OfType<IModule>()) { module.Start(); } Console.WriteLine("°´ÈÎÒâ¼üÍ˳ö..."); Console.ReadKey(); manager.Dispose(); } } ``` ### 4. ²å¼þĿ¼¼ÓÔØ ```csharp public class PluginLoader { public void LoadFromDirectory(String path) { if (!Directory.Exists(path)) return; // ¼ÓÔØ²å¼þĿ¼ÏµÄËùÓÐ DLL foreach (var file in Directory.GetFiles(path, "*.dll")) { try { Assembly.LoadFrom(file); } catch (Exception ex) { XTrace.WriteException(ex); } } } } // ʹÓà var loader = new PluginLoader(); loader.LoadFromDirectory("plugins"); var manager = new PluginManager { Identity = "MyApp" }; manager.Load(); // »á·¢ÏÖмÓÔØµÄ³ÌÐò¼¯ÖеIJå¼þ manager.Init(); ``` ## ×î¼Ñʵ¼ù ### 1. ²å¼þ½Ó¿ÚÉè¼Æ ```csharp // ¶¨ÒåÇåÎúµÄÀ©Õ¹µã½Ó¿Ú public interface IPlugin { Boolean Init(String? identity, IServiceProvider provider); } // ¹¦ÄܽӿÚÓë²å¼þ½Ó¿Ú·ÖÀë public interface IDataExporter { String Format { get; } Byte[] Export(Object data); } // ²å¼þͬʱʵÏÖÁ½¸ö½Ó¿Ú [Plugin("ExportSystem")] public class ExcelExporter : IPlugin, IDataExporter { public String Format => "xlsx"; public Boolean Init(String? identity, IServiceProvider provider) => true; public Byte[] Export(Object data) { /* ... */ } } ``` ### 2. ÒÀÀµ×¢Èë ```csharp [Plugin("MyApp")] public class DatabasePlugin : IPlugin { private IDbConnection? _connection; private ILogger? _logger; public Boolean Init(String? identity, IServiceProvider provider) { // ´ÓÈÝÆ÷»ñÈ¡ÒÀÀµ _connection = provider.GetService<IDbConnection>(); _logger = provider.GetService<ILogger>(); if (_connection == null) { _logger?.Error("δÕÒµ½Êý¾Ý¿âÁ¬½Ó"); return false; } return true; } } ``` ### 3. ´íÎó´¦Àí ```csharp [Plugin("MyApp")] public class SafePlugin : IPlugin { public Boolean Init(String? identity, IServiceProvider provider) { try { // ³õʼ»¯Âß¼­ return true; } catch (Exception ex) { XTrace.WriteException(ex); return false; // ·µ»Ø false ¶ø²»ÊÇÅ׳öÒì³£ } } } ``` ### 4. ×ÊÔ´ÊÍ·Å ```csharp [Plugin("MyApp")] public class ResourcePlugin : IPlugin, IDisposable { private FileStream? _file; private Boolean _disposed; public Boolean Init(String? identity, IServiceProvider provider) { _file = File.OpenWrite("plugin.log"); return true; } public void Dispose() { if (_disposed) return; _disposed = true; _file?.Dispose(); } } ``` ## Ïà¹ØÁ´½Ó - [¶ÔÏóÈÝÆ÷ ObjectContainer](/NewLife/X/Blob/dev/Doc/object_container-¶ÔÏóÈÝÆ÷ObjectContainer.md) - [·´ÉäÀ©Õ¹ Reflect](/NewLife/X/Blob/dev/Doc/reflect-·´ÉäÀ©Õ¹Reflect.md) - [ÇáÁ¿¼¶Ó¦ÓÃÖ÷»ú Host](/NewLife/X/Blob/dev/Doc/host-ÇáÁ¿¼¶Ó¦ÓÃÖ÷»úHost.md)