【问题标题】:IOC Container and primatives when creating wrapper创建包装器时的 IOC 容器和原语
【发布时间】:2009-12-08 15:49:23
【问题描述】:

我正在尝试为我的 IOC 容器创建一个接口包装器,因此我不必依赖特定的容器。我的问题是我接受的一些服务类的 companyID 是一个字符串。我想制作像

这样的通用接口方法

T Resolve<T>() 其中 T 是服务接口。

现在我在幕后使用 StructureMap 并知道具体的构造函数是否接受 companyID,所以我将执行以下操作:

ObjectFactory.With("companyid").EqualTo("someCompanyID").GetInstance<ICompanyService>();

我将这种调用封装在一个接口方法中: ICompanyService GetCompanyService(string companyID)

按照我现在的方式,应用程序必须初始化 StructureMaps 配置,并且传递回服务的具体类必须了解很多关于构造函数的信息。我希望这种情况不会发生,并使包装器具有通用性。有没有什么好办法,不用在界面上的每个方法都加上companyID?

【问题讨论】:

    标签: c# architecture inversion-of-control structuremap


    【解决方案1】:

    就我个人而言,我并不真正关心抽象出 MSUnity(我选择的 IOC 容器)。对我来说,这一步太远了。听起来您正在使用结构图特定的功能,这将使抽象变得更加困难。

    您知道CommonServiceLocator project?。主要有两种方法:

    protected override object DoGetInstance(Type serviceType, string key) { }
    protected override IEnumerable<object> DoGetAllInstances(Type serviceType) {}
    

    只要您坚持使用这些,您就可以轻松切换。这是some more info。

    【讨论】:

    • 我对 SM 进行了一些抽象,只是不完全。我正在查看一些制作包装器的开源代码,但它没有考虑到 ctors 中的原语。
    • @CSharpAtl- 重新考虑你的设计。像这样的框架必须以最低的公分母工作。您需要确定能够切换 IOC 是否比能够使用 StructureMap 特定功能更重要。
    • +1 我听到你的声音....只是一直在尝试解决这个问题,并且看着 MVC Turbine 创造了类似的东西已经再次思考。
    【解决方案2】:

    MvcContrib 中有一个 DependencyResolver 类。

    另一方面,大多数时候我只是从我的应用项目中引用 IoC 容器。例如,我只是为 ctor 注入设置了我的类,当我需要获取一个实例(在应用程序项目中)时,我只需向 IoC 容器询问它。 IoC 容器可能会担心填充 ctor 参数,但对象不知道 IoC 容器。这样我的应用项目是唯一需要引用 IoC 容器的项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多