gpt4 book ai didi

c# - 我应该如何管理类依赖/重构?

转载 作者:行者123 更新时间:2023-11-30 16:21:53 25 4
gpt4 key购买 nike

我的应用程序实现了一种模块化架构,可以动态加载一个或多个“插件”程序集。每个程序集都包含一个实现 IPlugin 接口(interface)的类,提供宿主应用用来与插件交互的各种方法和属性。

这个类不可避免地依赖于插件中的其他类,而这些类又可能有自己的依赖性。到目前为止,我一直在使用 CaSTLe Windsor(每个插件都包含一个 IWindsorInstaller,我在其中注册其依赖项)来管理所有这些,并通过它们的构造函数进行 DI。缺点是类必须是 public 才能使这种方法起作用。

我现在明白了,想通过将所有这些类设为internal 来锁定插件,但是我不确定处理依赖项的最佳方式,我想是这样的将无法使用温莎。我不希望类实例化它们自己的依赖项(不是松散耦合、缺乏可测试性等),那么还有哪些其他方法?

最佳答案

The downside is that the classes have to be public for this approach to work.

这不是真的。您可以注册内部的东西,但您可能会失去 CaSTLe Windsor(或与此相关的任何 DI 容器)的 Autowiring (自动构造函数注入(inject))功能。您可以通过注册手动创建这些类型的委托(delegate)来注册内部内容。例如:

container.Register(Component.For<IService>()
.UsingFactoryMethod(() =>
{
var log = container.Resolve<ILogger>();
return new RealService(log);
})
.LifeStyle.Transient);

使用 new 手动创建服务不是最佳选择,因为 Autowiring 使插件程序集的组合根保持最可维护性,但我认为在您的情况下没有好的选择。不过,这比让每个服务创建自己的依赖项(可怜的 DI)要好。

更新

我想起了一些事情:当你使用泛型方法注册这些内部类型时,应该仍然可以使用内部类型进行 Autowiring ,比如这个:

container.Register(Component.For<IService>()
.ImplementedBy<RealService());

为此,RealService 的构造函数必须是公共(public)的(但 RealService 本身可以是内部的)。这甚至适用于部分信任,例如在非常受限的 Silverlight 沙箱中运行时(或者至少,它适用于 Simple Injector,但 CaSTLe 也应该能够做到这一点)。

关于c# - 我应该如何管理类依赖/重构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12860291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com