Implement two example plugins (MongoDB connection wrapper and consumer of this conn wrapper) which is sharing types between them

This commit is contained in:
ChronosX88 2020-09-21 22:18:31 +04:00
parent d14a058d41
commit a829042581
Signed by: ChronosXYZ
GPG Key ID: 085A69A82C8C511A
4 changed files with 146 additions and 0 deletions

View File

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../../Zirconium/Zirconium.csproj">
<ExcludeAssets>runtime</ExcludeAssets>
</ProjectReference>
<PackageReference Include="MongoDB.Bson" Version="2.10.4" />
<PackageReference Include="MongoDB.Driver" Version="2.10.4" />
<PackageReference Include="MongoDB.Driver.Core" Version="2.10.4" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,58 @@
using System.Collections.Immutable;
using System.Collections.Generic;
using Zirconium.Core.Plugins.Interfaces;
using MongoDB.Driver;
using Zirconium.Core.Logging;
namespace MongoDBPlugin
{
class Plugin : IPluginAPI
{
private IMongoDatabase _database;
public dynamic GetExportedAPI()
{
return _database;
}
public System.Type[] GetExportedTypes()
{
// var mongoCore = Assembly.Load("MongoDB.Driver.Core");
// var mongoBson = Assembly.Load("MongoDB.Bson");
return new System.Type[] {typeof(IMongoDatabase)};
}
public string GetPluginUniqueName()
{
return "MongoDB";
}
public void Initialize(IPluginHostAPI pluginHostAPI)
{
var settingsDynamic = pluginHostAPI.GetSettings(this);
var settings = (IImmutableDictionary<string, dynamic>) ((IDictionary<string, object>)settingsDynamic).ToImmutableDictionary();
var host = (string) settings.GetValueOrDefault("Host");
var port = (int) settings.GetValueOrDefault("Port");
var user = (string) settings.GetValueOrDefault("User");
var password = (string) settings.GetValueOrDefault("Password");
var database = (string) settings.GetValueOrDefault("Database");
MongoClient client;
if (user == null && password == null)
{
client = new MongoClient($"mongodb://{host}:{port}");
}
else
{
client = new MongoClient($"mongodb://{user}:{password}@{host}:{port}");
}
var db = client.GetDatabase(database);
Log.Info("MongoDB is connected");
_database = db;
}
public void PreInitialize(IPluginManager pluginManager) { }
}
}

View File

@ -0,0 +1,57 @@
using Zirconium.Core.Plugins.Interfaces;
using MongoDB.Driver;
using Zirconium.Core.Logging;
using System;
namespace TestMongoDB
{
class Plugin : IPluginAPI
{
private IMongoDatabase _database;
public dynamic GetExportedAPI()
{
return null;
}
public Type[] GetExportedTypes()
{
return null;
}
public string GetPluginUniqueName()
{
return "TestMongoDB";
}
public void Initialize(IPluginHostAPI pluginHostAPI)
{
var tm = new TestModel();
tm.ABC = "qweqowie";
_database.GetCollection<TestModel>("test_model").InsertOne(tm);
}
public void PreInitialize(IPluginManager pluginManager)
{
var db = pluginManager.Depends(this, "MongoDB");
var receivedType = db.GetType();
Log.Debug(db.GetType().FullName);
Log.Debug(db.GetType().AssemblyQualifiedName);
foreach (Type i in db.GetType().GetInterfaces()) {
Log.Debug("DB object interface: " + i.AssemblyQualifiedName);
}
Log.Debug("Type info in current assembly context:");
var mongoDBType = typeof(IMongoDatabase);
Log.Debug(mongoDBType.FullName);
Log.Debug(mongoDBType.AssemblyQualifiedName);
Log.Debug(new Uri(mongoDBType.Module.Assembly.CodeBase).LocalPath);
Log.Debug($"Casting compatibility: {mongoDBType.IsAssignableFrom(db.GetType())}");
_database = (IMongoDatabase) db;
}
}
class TestModel
{
public string ABC { get; set; }
}
}

View File

@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../../Zirconium/Zirconium.csproj">
<ExcludeAssets>runtime</ExcludeAssets>
</ProjectReference>
<ProjectReference Include="../MongoDB/MongoDB.csproj"/>
</ItemGroup>
</Project>