DI仅在需要时创建对象

时间:2016-02-15 08:02:26

标签: .net asp.net-mvc asp.net-web-api dependency-injection factory

到目前为止,我的服务逻辑看起来像这样

Mapper.CreateMap<FooBarRecord, FooBarVm>().ForAllMembers(opt => opt.Ignore());
Mapper.CreateMap<FooBarRecord, FooBarVm>()
    .ForMember(s => s.bar, m => m.MapFrom(rec => rec.bar))
    //other columns - those are OK
;

通过这种设计我遇到了问题。我的项目有MVC和Web Api控制器,因为我必须为web api和mvc请求创建不同的容器,我无法确定要使用哪个容器。所以我决定应该摆脱存储库工厂并注入存储库,但我不想立即创建public class MyService : IMyService { private readonly IDataRepositoryFactory _repositoryFactory; private readonly IUnitOfWork _unitOfWork; public MyService (IDataRepositoryFactory repositoryFactory, IUnitOfWork unitOfWork) { _repositoryFactory = repositoryFactory; _unitOfWork = unitOfWork; } public object JustDoIt(string someValue) { var repo1 = _repositoryFactory.GetDataRepository<IMyRepository1>(); var result = repo1.GetSomething(someValue); if (result == null) { var repo2 = _repositoryFactory.GetDataRepository<IMyRepository2>(); var result = repo2.GetSomething(someValue); } return result; } } ,因为我可能不需要它。

所以也许你对我应该做些什么有一些建议。

1 个答案:

答案 0 :(得分:0)

这个概念称为延迟加载,可以使用Lazy类来实现。您可以注入一个Lazy对象,而不是注入存储库,只要在Lazy对象上调用Value属性,就可以构建接口。

您可以删除工厂并注入可能需要的所有存储库。

public class MyService : IMyService {
    private readonly Lazy<IRepository> _repo;

    public MyService(Lazy<IRepository> repo) {
        _repo = repo;
    }

    public void Act(...) {
        _repo.Value.Save(..);
    }
}