【问题标题】:Create new Repositories while still using Dependency Injection with wcf在仍然使用 wcf 的依赖注入的同时创建新的存储库
【发布时间】:2011-06-06 09:29:47
【问题描述】:

我有一个接收 IRepository 的 wcf 服务

IRepository irepo;

public SomeService(IRepository repo)
{
    this.irepo = repo;
}

存储库包含 Save、Delete 等方法,并通过构造函数获取 CustomDataContext:

public class ExampleRepository: IRepository, IDisposible {

   public ExampleRepository(CustomDataContext datacontext)
   {
       this.dc = datacontext;
   }

   ...
}

稍后在服务中,我有一些方法需要使用存储库(然后在方法中处理它)。现在因为我想使用依赖注入来切换存储库进行测试而不是测试,我如何声明具体的存储库。我可以像这样创建存储库的新实例:

using (IRepository repos = (IRepository)Activator.CreateInstance(irepo.GetType(), new object[] {new CustomDataContext()} ))
{
     ...
}

但我认为这是一种缓慢的做法(而且不正确)

有没有办法根据注入的类型创建一个新的存储库,或者我只是让事情变得更复杂然后有必要?

提前致谢

【问题讨论】:

  • 看看这篇文章:bit.ly/bF7jL3。它提供了如何在使用 LINQ to SQL 时对代码进行单元测试。

标签: c# wcf linq-to-sql dependency-injection


【解决方案1】:

依赖注入的整个想法是有一些容器可以为您解决依赖关系。您是否有理由不使用框架来注入依赖项,例如结构映射或统一?

如果你确实有一个容器,你应该从容器中请求一个你的类型的新实例,它会为你实例化它并为你解决该特定类型的所有依赖项(如果有的话)。

【讨论】:

  • 啊。每次我想要一个新的存储库时,我都没有考虑从容器中请求一个新对象。我想我陷入了构造函数注入的心态。谢谢
  • 即使在进行构造函数注入时,从容器中请求新实例也很重要,因为您的容器可以将适当的依赖项注入到新构造的类型中。
【解决方案2】:

如果您的容器允许此类行为,请尝试注入 Func<CustomDataContext, IRepository>。否则,注入一个IRepositoryFactory,它会有一个CreateInstance 方法。

【讨论】:

    猜你喜欢
    • 2011-10-18
    • 1970-01-01
    • 2018-05-02
    • 2010-11-27
    • 1970-01-01
    • 2017-06-12
    • 2016-08-16
    • 1970-01-01
    • 2010-10-01
    相关资源
    最近更新 更多