Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.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# 如何重构这个工厂方法?_C#_Dependency Injection_Simple Injector - Fatal编程技术网

C# 如何重构这个工厂方法?

C# 如何重构这个工厂方法?,c#,dependency-injection,simple-injector,C#,Dependency Injection,Simple Injector,我有下面的工厂方法,它只返回正确的IDatabase实现。我想将其重构到我的SimpleInjector容器中,但不确定如何重构 public class DALFactory { public static IDatabase GetDAL() { string asm = "SQL"; /* Hardcoded choice of DAL */ if (asm == "XML")

我有下面的工厂方法,它只返回正确的IDatabase实现。我想将其重构到我的SimpleInjector容器中,但不确定如何重构

    public class DALFactory
    {
        public static IDatabase GetDAL()
        {
            string asm = "SQL"; /* Hardcoded choice of DAL */
            if (asm == "XML")
                return new XmlDatabase();
            if (asm == "SQL")
                return new SqlDatabase();
            return null;
        }
    }
我试图理解如何注册集合,但在程序中请求IDatabase实例时,我应该如何告诉SimpleInjector使用哪一个集合?对任何想法都持开放态度。只是一个理论性的程序,我正在尝试重构以供实践。到目前为止,第一次使用DI IoC是一次如此愉快、令人大开眼界的体验

我已经试过了,我接近了吗

Container.RegisterCollection<IDatabase>(new [] { typeof(SqlDatabase), typeof(XmlDatabase)});
Container.Register<IDatabase, XmlDatabase>(Lifestyle.Singleton);
Container.Register<IDatabase, SqlDatabase>(Lifestyle.Singleton);
如果asm值是硬编码的,或者基于配置文件中的值,那么基本上就是说一个正在运行的应用程序只有一个特定版本的IDatabase

这意味着您应该注册为:

string asm = "SQL"; /* Hardcoded choice of DAL */
if (asm == "XML")
    container.Register<IDatabase, XmlDatabase>();
if (asm == "SQL")
    container.Register<IDatabase, SqlDatabase>();

对不起,我是个新手。我在我的容器类中注册了很多东西,但是忘记了我实际上是在一个C类中,不仅限于我的容器库方法,我还可以把我自己的逻辑放进去。答案很简单,我现在觉得自己很笨。非常感谢。如果我想让它更易于测试,而不是这种难看的硬编码,您可以推荐什么替代方案?因此IDatabase也可以是一个模拟实现。只需在我的硬编码if循环中添加第三个选项,或者有更好的方法吗?@Amivit Ehen说到单元测试,答案完全不同。对于单元测试,您根本不使用容器。你建立了一个手工测试的类。