具有多个存储库的依赖注入

use*_*807 6 c# wcf dependency-injection repository constructor-injection

我有一个wcf服务,在客户端我有:

var service = new ServiceReference1.CACSServiceClient()
Run Code Online (Sandbox Code Playgroud)

实际的服务代码是:

public CACSService() : this(new UserRepository(), new BusinessRepository()) { }

public CACSService(IUserRepository Repository, IBusinessRepository businessRepository)
{
     _IRepository = Repository;
     _IBusinessRepository = businessRepository;
}
Run Code Online (Sandbox Code Playgroud)

所以,所有这一切都很好,但我不喜欢我如何同时新建所有的存储库,因为客户端代码可能不需要新的UserRepository,只有兴趣新的BusinessRepository.那么,有没有办法将一些东西传递给这段代码:
var service = new ServiceReference1.CACSServiceClient()
根据调用服务的代码或者在为我的实体框架设计存储库时需要进行的任何其他建议,告诉它哪个存储库是新的.Thankx

Mar*_*ann 16

纯DI的妙处在于,你不应该担心你依赖的寿命,因为这是为您提供谁他们(一个DI容器,或者你自己写一些其他的代码)进行管理.

(顺便说一下,你应该摆脱你当前的Bastard Injection构造函数.抛弃无参数构造函数并保留显式广告其依赖关系的构造函数.)

像这样保留你的构造函数,并根据需要使用_IRepository和_IBusinessRepository:

public CACSService(IUserRepository Repository, IBusinessRepository businessRepository) 
{ 
    _IRepository = Repository; 
    _IBusinessRepository = businessRepository; 
} 
Run Code Online (Sandbox Code Playgroud)

如果您担心在运行时不需要其中一个存储库,您可以注入一个延迟加载的实现,例如IUserRepsository,而不是您最初想到的那个.

我们假设IUserRepository看起来像这样:

public interface IUserRepository
{
    IUser SelectUser(int userId);
}
Run Code Online (Sandbox Code Playgroud)

您现在可以实现这样的延迟加载实现:

public class LazyUserRepository : IUserRepository
{
    private IUserRepository uRep;

    public IUser SelectUser(int userId)
    {
        if (this.uRep == null)
        {
            this.uRep = new UserRepository();
        }
        return this.uRep.SelectUser(userId);
    }
}
Run Code Online (Sandbox Code Playgroud)

创建CACService时,可以通过向其中注入LazyUserRepository来实现,这可以确保只在需要时才会初始化真正的UserRepository.

这种方法的美妙之处在于,在您需要它之前,您不必这样做.通常,这实际上不是必需的,所以能够将这种优化推迟到实际需要之前是很好的.

我首先在这里这里描述了Lazy Dependencies 的技术.

  • 同意.不要将自己限制为默认ctor,因为这是WCF建议的.使用IInstanceProvider构建您的服务实例. (2认同)

Ree*_*sey 0

您可以在其属性中延迟加载它们,而不是在构造时实例化(“更新”)存储库。这将允许您保留第二个构造函数,但让第一个构造函数不执行任何操作。

然后,用户可以根据需要分配这些,否则。

例如:

public class CACSService
{
    public CACSService() {}

    public CACSService(IUserRepository Repository, IBusinessRepository businessRepository)
    {
        _IRepository = Repository;
        _IBusinessRepository = businessRepository;
    }

    private IUserRepository _IRepository;
    public IUserRepository Repository
    {
        get {
             if (this._IRepository == null)
                  this._IRepository = new UserRepository();
             return this._IRepository;
        }
    }

   // Add same for IBusinessRepository
}
Run Code Online (Sandbox Code Playgroud)