gpt4 book ai didi

c# - RegisterType 与 UnityContainer 中的接口(interface)

转载 作者:太空狗 更新时间:2023-10-30 00:36:04 29 4
gpt4 key购买 nike

我正在使用 UnityContainer,我想注册一个接口(interface),而不是一个类型,而是另一个接口(interface)。不幸的是,我无法干净地做到这一点..

我有几个通用的接口(interface),统一在一个接口(interface)里,需要注册到容器里。代码如下:

interface IDeviceImporter {
void ImportFromDevice();
}

interface IFileImporter {
void ImportFromFile();
}

interface IImporter : IDeviceImporter, IFileImporter {
}


class Importer1: IImporter {
}
class Importer2: IImporter {
}

进入图书馆时,我知道使用哪个进口商,所以代码是这样的:

var container = new UnityContainer();
if (useFirstImport) {
container.RegisterType<IImporter, Importer1>();
} else {
container.RegisterType<IImporter, Importer2>();
}

然后我也想用 IDeviceImporter 和 IFileImporter 注册这个特定的类。我需要这样的东西:

container.RegisterType<IDeviceImporter, IImporter>();

但是使用该代码我得到一个错误:IImporter 是一个接口(interface),无法构造

我可以在条件内执行此操作,但它会被复制粘贴。我能做到

container.RegisterInstance<IDeviceImporter>(container.Resolve<IImporter>());

但是真的很脏。请任何人给我一些建议:)

最佳答案

嗯,这取决于您使用的生命周期管理类型。这里:

  container.RegisterType<IImporter, Importer1>();

您使用的是 transient 的,因此您可以执行以下操作:

var container = new UnityContainer();

if (useFirstImport) {
container.RegisterType<IImporter, Importer1>();
container.RegisterType<IDeviceImporter, Importer1>();

} else {
container.RegisterType<IImporter, Importer2>();
container.RegisterType<IDeviceImporter, Importer2>();
}

不用担心错误。 container.Resolve<IImporter>()将在每次调用时创建新实例,就像 container.Resolve<IDeviceImporter>()会的。

但是如果你使用 ContainerControlledLifetimeManager那么无论如何你都必须使用container.RegisterInstance<IDeviceImporter>(container.Resolve<IImporter>())因为 Unity 没有提供其他方法来做到这一点。

这个功能真的很有趣,如果能有类似container.CreateSymLink<IDeviceImporter, IImporter>()的东西就好了但是没有这样的东西。

关于c# - RegisterType 与 UnityContainer 中的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2911539/

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