使用Autofac限制实例数量?

时间:2017-10-24 09:08:33

标签: inversion-of-control autofac multiple-instances

我有一个控制台应用程序,它将创建一个类的实例并在其上执行一个方法,而这就是它所做的一切(但这种方法可能会做很多事情)。该类在运行时根据命令行参数确定,并将其注册到Autofac,以便可以正确解析,从而提供从命令行提取的特定于类的构造函数参数。这一切都有效。

现在,我需要对每个可以在任何时间运行的类的实例数施加系统范围的限制。我可能会使用一个简单的SQL数据库来跟踪每个类允许和运行的实例的数量,我对SQL方面没有任何问题。

但是如何使用Autofac以一种不错的方式实际施加此限制?

我想我会有一些“插槽服务”可以做这样的事情:

  1. 尝试保留新实例“slot”。
  2. 如果没有其他插槽,请记录消息并终止该过程。
  3. 如果插槽成功保留,请创建实例并将其返回。
  4. 我的想法也是在Dispose方法中释放实例的插槽,最好是在插槽服务上使用另一种方法。

    我如何将其融入Autofac?

    一种可能性是注册我想用实例执行上述步骤的lambda / delegate实例化的类。但在那种情况下,我如何“终止”?抛出异常?这将需要一些代码来捕获异常并记录它或者在终止进程之前简单地忽略它。我不喜欢它。我想在委托,lambda或服务中使用整个插槽预留。

    另一种解决方案可能是在Autofac之外进行插槽预留,但这看起来有些混乱。

    我更喜欢一种解决方案,其中“插槽服务”本身可以很好地进行单元测试,即非静态和接口,最好用Autofac解决。

    我确定我在这里遗漏了一些明显的东西...有什么建议吗?

    到目前为止,这是我“最好的选择”:

    static void Main(string[] args)
    {
        ReadCommandLine(args, out Type itemClass, out Type paramsClass, out Type paramsInterface, out object parameters);
        BuildContainer(itemClass, paramsClass, paramsInterface, parameters);
        IInstanceHandler ih = Container.Resolve<IInstanceHandler>();
        if (ih.RegisterInstance(itemClass, out long instanceid))
        {
            try
            {
                Container.Resolve<IItem>().Execute();
            }
            finally
            {
                ih.UnregisterInstance(itemClass, instanceid);
            }
        }
    }
    

0 个答案:

没有答案