我正在为第三方用户开发API,但我被困住了:
API将如下所示:
public interface IFoo
{
Init(IComponent component);
...
}
接口需要由第三方实现,但我们会调用Init方法。我的问题是我将一个IComponent实例传递给它们,它们可以在Init方法中使用,但它们不应该在其他任何地方使用。
是否有可能进行这样的运行时检查,他们没有保存它,或者以某种方式组织这种行为会导致无法在Init方法中使用该IComponent实例?
答案 0 :(得分:3)
我认为你不能直接控制Init()在任何地方的实现方式。但是,您的IComponent可能像它需要的那样偷偷摸摸,执行类似下面的代码将使插件无法在事后使用该实例。
public interface IComponent
{
void DoSomething();
}
class Component : IComponent
{
bool flag;
public DoSomething()
{
if( flag )
throw new NotSupportedException( "Operation not supported anymore." );
// Do something normal during Init().
}
internal void MarkCOmplete()
{
flag = true;
}
}
....
void Initialize()
{
var component = new Component();
foreach(var plugin in plugins)
{
plugin.Init(component);
}
component.MarkComplete();
}