解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
|
# ²å¼þ¿ò¼Ü 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)
|