C# IOC和动态参数

C# IOC和动态参数,c#,inversion-of-control,C#,Inversion Of Control,我在这里读过一些关于在传递到构造函数时不要混合参数的帖子,但我有一个问题。我有类,它们都依赖于公司参数,所有的方法都依赖于公司。我不想在每次方法调用时都要传递公司,我想把它传递给构造函数。这确实会给类带来困难,因为我必须确保具体类的构造函数接受某些参数,我不喜欢这些参数(不能将其放在作为接口的合同中)。建议将公司名称传递到类中的每个方法调用中???如果所有方法都需要公司名称,那么从OOP设计的角度来看,将公司名称传递到类的构造函数中是完全合理的。这意味着如果没有公司名称,您的类将无法正常运行,因

我在这里读过一些关于在传递到构造函数时不要混合参数的帖子,但我有一个问题。我有类,它们都依赖于公司参数,所有的方法都依赖于公司。我不想在每次方法调用时都要传递公司,我想把它传递给构造函数。这确实会给类带来困难,因为我必须确保具体类的构造函数接受某些参数,我不喜欢这些参数(不能将其放在作为接口的合同中)。建议将公司名称传递到类中的每个方法调用中???

如果所有方法都需要公司名称,那么从OOP设计的角度来看,将公司名称传递到类的构造函数中是完全合理的。这意味着如果没有公司名称,您的类将无法正常运行,因此该类的任何使用者都将被迫提供所需的依赖项。

如果所有方法都需要公司名称,那么从OOP设计的角度来看,将该公司名称传递给类的构造函数是完全合理的。这意味着您的类在没有公司名称的情况下无法正常运行,因此该类的任何使用者都将被迫提供所需的依赖项。

假设您没有使用已知的IoC框架,该框架已经为您处理了这一问题,您可以将其作为属性注入来实现。我也不认为在构造函数级别这样做有什么问题——你还没有说为什么你觉得这是个问题


当然不建议将它传递给每个方法(显然是多余的)。

假设您没有使用已知的IoC框架,该框架已经为您处理了这个问题,那么您可以将其作为属性注入来实现。我也不认为在构造函数级别这样做有什么问题——你还没有说为什么你觉得这是个问题


当然不建议将它传递给每个方法(显然是多余的)。

是的,在国际奥委会的世界里,大多数工具(Spring.Net、Castle Windsor,甚至LinFu)都有方法可以为您解决这个问题,所以您可以在配置中定义一个,每次您获得一个副本(从容器或其他任何地方)时,它都是预配置的

你可以包装你的“容器”

IWindsorContainer _ConfiguredContainer = null;

public IWindsorContainer GetContainer()
{
   if (LoggedIn == false)
      throw new InvalidOperationException("Cannot be called before a user logs in");

   if (_ConfiguredContainer == null)
   {
      _ConfiguredContainer = new WindsorContainer(new XmlInterpreter());

      // Do your 'extra' config here.
      _ConfiguredContainer.AddComponentWithProperties(/*blah blah blah*/);
   }

   return _ConfiguredContainer;
} 

是的,在国际奥委会的世界里,大多数工具(Spring.Net、Castle Windsor,甚至LinFu)都有一些方法可以帮你解决这个问题,所以你可以在配置中定义一个方法,每次你得到一个副本(从容器或其他任何地方)时,它都是预配置的

你可以包装你的“容器”

IWindsorContainer _ConfiguredContainer = null;

public IWindsorContainer GetContainer()
{
   if (LoggedIn == false)
      throw new InvalidOperationException("Cannot be called before a user logs in");

   if (_ConfiguredContainer == null)
   {
      _ConfiguredContainer = new WindsorContainer(new XmlInterpreter());

      // Do your 'extra' config here.
      _ConfiguredContainer.AddComponentWithProperties(/*blah blah blah*/);
   }

   return _ConfiguredContainer;
} 

如果类的行为取决于所述的公司名称,那么将其传递给构造函数有什么错?构造函数本身就是一个契约——你必须用一些东西来实例化它。

如果你的类的行为依赖于所说的公司名称,那么将它传递给构造函数有什么错?构造函数本身就是一个契约——你必须用一些东西来实例化它。

你可以有一个ICommonSettings(几乎像一个全局静态类),它被注入到你的登录管理器(设置公司名称)和你谈论的对象中。这样,您就不必将其传递给构造函数或方法。

您可以拥有一个ICommonSettings(几乎像一个全局静态类),它被注入到您的登录管理器(以设置公司名称)和您所谈论的对象中。这样,您就不必将其传递给构造函数或方法。

我使用StructureMap,几乎创建了一个factory类,该类接受公司,并根据为接口配置的内容创建了正确的类。我不喜欢的是,我必须假设这个类有正确的构造函数……嗯,在我的回答中,我没有提到任何DI容器。从面向对象的角度来看,您必须在构造函数中提供公司名称,因为您的所有方法都需要它。我使用StructureMap,几乎创建了一个工厂类,该类接受公司,并根据为接口配置的内容创建了正确的类。我不喜欢的是,我必须假设这个类有正确的构造函数……嗯,在我的回答中,我没有提到任何DI容器。从OOP的角度来看,您必须在构造函数中提供公司名称,因为您的所有方法都需要它。您是否考虑了IoC框架?我正在使用StructureMap作为IoC工具。您是否考虑了IoC框架?我正在使用StructureMap作为IoC工具。无法对其进行预配置,因为我在登录之前不会知道。用户登录后,您可以随时手动将其“添加”到容器中。我正在编辑上面的答案以显示一个示例…无法对其进行预配置,因为在登录之前我不会知道。用户登录后,您始终可以手动将其“添加”到容器中。我正在编辑上面的答案以显示一个示例…我正在使用StructureMap,但在用户登录之前我不知道“公司”的值。我正在使用StructureMap,但在用户登录之前我不知道“公司”的值。