public interface IPlugin
{
void Execute();
}
public class FirstPlugin : IPlugin
{
public string SomeSetting1 { get; set; }
public void Execute() { }
}
public class SecondPlugin : IPlugin
{
public string SomeSettingA { get; set; }
public string SomeSettingB { get; set; }
public string SomeSettingC { get; set; }
public void Execute() { }
}
我有一个允许用户选择一个或多个插件的系统。在上面的代码中,我有一个IPlugin
接口,由许多类实现。每个类都可以拥有自己的属性集,每个用户都可以配置这些属性。
例如,用户A仅选择第一个插件并将SomeSetting1配置为具有值“ABC”。
用户B选择两个插件,但将第一个插件的SomeSetting1配置为具有“XYC”值。
public class User
{
public User(IPlugin[] plugins)
{
}
}
当我实例化一个用户时,我想获得一个用户配置的插件列表,这些插件应该与用户配置的内容保持一致。
但是,我在如何设计数据库以便能够以这种格式存储信息方面留下了空白。我可以有一张桌子:
User | Plugin
----------------
A | ...
B | ...
B | ...
...插件列将是插件的序列化表示,我可以将其反序列化为类。然而,这似乎是一个可怕/黑客的想法。有更好的方法吗?
答案 0 :(得分:1)
如果您不必通过Plugin列中序列化的某些属性查询数据库,我不认为这是一个可怕的/ hacky想法。另外......你可能会考虑使用像mongodb这样的非架构数据库。无论如何,我会使用序列化(可能是JSON对象,如果我稍后将使用javascript消耗该结果,或者如果更适合您的环境则使用某些XML)。
如果你想继续使用更多的关系方法...那么你将拥有一个包含插件属性的表格...列:UserId, PluginId, PropertyName, PropertyValue
...然后,表格包含插件:PluginId, PluginName
,和你的用户表:UserId,...and some columns for users
(这只是设计它的一种方法)问题是你有一些复杂对象的插件属性......在这种情况下,你必须将它们序列化为PropertyValue列...
答案 1 :(得分:0)
表
User
-----
UserID
Name
Plugin
------
PluginID
PluginName
PlugInProperty
------------------
PlugInPropertyId
PluginID
UserPlugin
------------
UserPluginId
UserId
PluginId
UserPlugInProperty
------------------
UserPluginId
PlugInPropertyId
Value