Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IOC的工厂模式,总是需要实例化吗?_C#_Factory_Factory Pattern - Fatal编程技术网

C# IOC的工厂模式,总是需要实例化吗?

C# IOC的工厂模式,总是需要实例化吗?,c#,factory,factory-pattern,C#,Factory,Factory Pattern,我希望我的应用程序不严格绑定到IOC,因此我的应用程序基本上需要调用IOC工厂模式,以解决运行时的特定实现 首先,我创建了我的界面: IIOCService interface IIOCService { void RegisterSingleton<RegisterType>() where RegisterType : class; void RegisterMultiple<RegisterType>() where

我希望我的应用程序不严格绑定到IOC,因此我的应用程序基本上需要调用IOC工厂模式,以解决运行时的特定实现

首先,我创建了我的界面:

IIOCService

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>();
}