C# IOC的工厂模式,总是需要实例化吗?
我希望我的应用程序不严格绑定到IOC,因此我的应用程序基本上需要调用IOC工厂模式,以解决运行时的特定实现 首先,我创建了我的界面: IIOCServiceC# IOC的工厂模式,总是需要实例化吗?,c#,factory,factory-pattern,C#,Factory,Factory Pattern,我希望我的应用程序不严格绑定到IOC,因此我的应用程序基本上需要调用IOC工厂模式,以解决运行时的特定实现 首先,我创建了我的界面: IIOCService interface IIOCService { void RegisterSingleton<RegisterType>() where RegisterType : class; void RegisterMultiple<RegisterType>() where
interface IIOCService
{
void RegisterSingleton<RegisterType>()
where RegisterType : class;
void RegisterMultiple<RegisterType>()
where RegisterType : class;
void RegisterMultiple<RegisterType>(IEnumerable<Type> implementationTypes);
// and so on
}
现在我的问题是:
我是否需要为每一个需要IOC的班级重新启动工厂,或者有更优雅的方式
IIOCService iocService = new IOCFactory().GetService(IOCFactory.IOC.TinyIOC);
// code needed everytime I need to use IOC (i.e. ServiceLocator, ViewModelLocator, etc.)
// is this code a bit redundant ???
我同意在IOC容器周围创建包装器有点多余。但是,如果需要调用IOC容器来解析特定的、运行时确定的接口实例,则可以创建一个reslove接口(不是使用工厂模式,而是保持在IOC模式内)。类似这样的东西(这太基本了,只是为了让你了解这个想法):
公共接口IResolve{
公共关系不能解决();
}
您可以为此特定接口创建一个实现,并将其公开给您的IOC容器。在单实例模式中执行此操作没有问题
当您需要解析IOC容器解析的类中的某些内容时,只需将IResolve添加到构造函数中,就可以对IOC容器进行寻址,而不依赖于所使用的IOC容器的任何品牌
我希望这能为您带来一些清晰度?那么您正在为您的IoC容器编写IoC容器?什么时候停?无论如何,你的IoC/DI框架不应该触及你应用程序的那么多方面,因此它不应该触及那么多代码,因此替换起来相当简单。我看到它的一般做法是实例化容器并在[web]应用程序启动时注册所有内容,然后将其存储为全局可访问结构的属性。嗯。。。我怕被误解。我不想用IOC本身来解决IOC实现问题(是的,这将是可怕的和冗余的),而是用另一种方式(即硬编码或使用属性文件),这样你就可以让你的应用程序在运行时切换IOC容器了?@startupOk的Josh Verbies,我现在明白了。如果我是你,我仍然会使用上面的模式来获得一个解析器,但是我会在应用程序引导程序中进行切换(您将在其中配置IOC容器)。这样,用于切换IOC容器的逻辑只包含在一个位置(双关语)中。所以我认为重新启动工厂有点多余
class IOCFactory
{
public enum IOC { TinyIOC }
public IIOCService GetService(IOC iocType)
{
switch (iocType)
{
case IOC.TinyIOC:
return TinyIOCServiceImpl.Current;
default:
throw new NotSupportedException();
}
}
}
IIOCService iocService = new IOCFactory().GetService(IOCFactory.IOC.TinyIOC);
// code needed everytime I need to use IOC (i.e. ServiceLocator, ViewModelLocator, etc.)
// is this code a bit redundant ???
public interface IResolve {
public T Resolve<T>();
}