【问题标题】:Dependency Injection - Unity Constructor injection not working, only getter setter injection依赖注入 - Unity 构造函数注入不起作用,只有 getter setter 注入
【发布时间】:2017-03-07 07:33:06
【问题描述】:

我遇到了 Unity 依赖注入的问题。当我尝试使用构造函数注入时,我注入的服务保持为空/空。

public UserService(IUnitOfWorkIntranet unitOfWork, IUserRepository userRepository)
   {
     mappingToDomainModel = IntranetMappingToDomainModel.GetMappingToDomainModelInstance;
     IntranetAutoMapperConfiguration autoMapper = IntranetAutoMapperConfiguration.GetAutoMapperConfigurationInstance;
     unitOfWorkIntranet = unitOfWork;
     userRepository = userRepository;
    } 

但是,当我使用吸气剂时,一切正常。

private IUserRepository _userRepository
   {
      get
   {
      return GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(IUserRepository)) as UserRepository;
   }
   } 

据我所知,它在 UnityConfig.cs 中已正确配置

container.RegisterType<IUnitOfWorkIntranet, UnitOfWorkIntranet>();
container.RegisterType<IUserService, UserService>();
container.RegisterType<IUserRepository, UserRepository>();

我在这里遗漏了什么吗?为什么我的构造函数注入被破坏了?

欢迎任何帮助,问候!

【问题讨论】:

  • UserService 是如何解决的?
  • @Sergey Shushlyapin 感谢您的回复!它可以在控制器中使用 getter setter 依赖注入(使用 Unity)解决。
  • 可以这样做,但这是一种解决方法,因为属性注入被认为是可选的。我认为IUserRepositoryUserService必须拥有 依赖项,因此应该通过构造函数注入它以明确这种关系。
  • 是的,但问题是构造函数注入不起作用。该对象只是保持为空。
  • “空”是什么意思?显示填充UserService 代码。

标签: asp.net-mvc service dependency-injection repository unity-container


【解决方案1】:

有一个使用 Unity 的构造函数注入的简单工作示例:

public interface IUnitOfWorkIntranet { }

public class UnitOfWorkIntranet : IUnitOfWorkIntranet{}

public interface IUserRepository { }

public class UserRepository : IUserRepository{}

public interface IUserService{}

public class UserService : IUserService
{
    public IUnitOfWorkIntranet UnitOfWork { get; }
    public IUserRepository UserRepository { get; }
    public UserService(IUnitOfWorkIntranet unitOfWork, IUserRepository userRepository)
    {
        UnitOfWork = unitOfWork;
        UserRepository = userRepository;
    }
}

配置与解析:

var container = new UnityContainer();
container.RegisterType<IUnitOfWorkIntranet, UnitOfWorkIntranet>();
container.RegisterType<IUserService, UserService>();
container.RegisterType<IUserRepository, UserRepository>();

var service = (UserService)container.Resolve<IUserService>();

【讨论】:

  • 这就是我们的代码现在的样子。我添加了 public IUnitOfWorkIntranet UnitOfWork { get; } 公共 IUserRepository UserRepository { 获取; } 但这似乎并没有解决问题。
  • UserService 类中是否有默认构造函数?我怀疑Unity Dependency Resolver 可能没有正确配置。
  • 我不这么认为,UserService类中唯一的构造函数在上面的帖子中列出。再次感谢您迄今为止所做的一切努力!
猜你喜欢
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 2011-07-05
  • 1970-01-01
相关资源
最近更新 更多