【问题标题】:C# Unity InjectionFactory not workingC# Unity InjectionFactory 不工作
【发布时间】:2016-07-05 08:52:53
【问题描述】:

我正在使用 Unity 作为 IOC,并尝试使用工厂方法注入接口,该工厂方法将接口作为参数。

由于某种原因,工厂方法 GetTitleParser() 中的 configReader 参数为 null,并且未获取注入的 ConfigurationReader() 实例。

当我在 RegisterTypes 方法中存在新 InjectionFactory 的行中放置一个调试点时,ITitleParser 未显示为映射到正确的映射类型。

谁能帮助我在这里做错了什么?

这是我的代码:

public class UnityContainerBuilder
{
    public static IUnityContainer Build()
    {
        var container = new UnityContainer();
        RegisterTypes(container);
        return container;
    }

    public static void RegisterTypes(IUnityContainer container)
    {
        // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
        container.LoadConfiguration();
        container.RegisterType<IConfigurationReader, ConfigurationReader>();
        container.RegisterType<ITitleParser>(new InjectionFactory(c => ParserFactory.GetTitleParser()));            
    }
}

public class ParserFactory
{
    public static ITitleParser GetTitleParser(IConfigurationReader configReader=null)
    {
        if(configReader==null) configReader = new ConfigurationReader();

        /* rest of code here...*/

        return parser;
    }
}   

当我使用以下代码时它可以工作。这是正确的做法吗?

    container.RegisterType<IConfigurationReader, ConfigurationReader>();
    container.RegisterType<ITitleParser>(new InjectionFactory(c =>
                                                                {
                                                                    var configReader = c.Resolve<IConfigurationReader>();
                                                                    var parser = ParserFactory.GetTitleParser(configReader);
                                                                    return parser;
                                                                }));

【问题讨论】:

    标签: c#-4.0 asp.net-web-api unity-container


    【解决方案1】:

    当你使用默认参数时,它等于:

    container.RegisterType<ITitleParser>(
        new InjectionFactory(c => ParserFactory.GetTitleParser(null)));
    

    因为,编译器会在方法调用中插入所有默认值(在您的情况下为null)。

    所以,你的代码是有效的:

    container.RegisterType<ITitleParser>(new InjectionFactory(c =>
    {
        var configReader = c.Resolve<IConfigurationReader>();
        var parser = ParserFactory.GetTitleParser(configReader);
        return parser;
    }));
    

    但我建议您删除默认值以使代码更具表现力。

    【讨论】:

      【解决方案2】:

      您的代码是有效的,但也许您可以避免混淆InjectionFactory 参数和ParserFactory

       public class UnityContainerBuilder
          {
              public static IUnityContainer Build()
              {
                  var container = new UnityContainer();
                  RegisterTypes(container);
                  return container;
              }
      
              public static void RegisterTypes(IUnityContainer container)
              {
                  // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
                  container.LoadConfiguration();
                  container.RegisterType<IConfigurationReader, ConfigurationReader>();
                  container.RegisterInstance<IAppConfig>(container.Resolve<IConfigurationReader>().ReadConfiguration());
                  container.RegisterType<ITitleParser, TitleParser>();            
              }
          }
      
          public class AppConfig: IAppConfig
          {
              public AppConfig(){}
              //value1 property
              //value2 property
              //etc
          }   
      
      
          public class ConfigurationReader: IConfigurationReader
          {
              public ConfigurationReader(){}
              public IAppConfig ReadConfiguration(){
                  var currentConfig = new AppConfig();
                  //read config from file, DB, etc and init currentCongif
                  return currentConfig;
              }
          }   
      
          public class TitleParser : ITitleParser
          {
              public TitleParser(IAppConfif)
              {
                  //config already readed, just do the work       
              }
          }   
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 2015-06-14
        • 2011-10-31
        • 1970-01-01
        • 1970-01-01
        • 2016-10-14
        • 1970-01-01
        相关资源
        最近更新 更多