C# 使用unity在singleton类中注入接口依赖项

C# 使用unity在singleton类中注入接口依赖项,c#,unity-container,C#,Unity Container,我正在使用Unity进行依赖项注入到目前为止,除了在单例类中使用依赖项外,它工作得很好 我有一个静态类来访问数据库函数 public class DB { private static readonly Lazy<DB> lazy = new Lazy<DB>(() => new DB()); public static DB Instance { get { return lazy.Value; } } p

我正在使用
Unity
进行
依赖项注入
到目前为止,除了在单例类中使用依赖项外,它工作得很好

我有一个静态类来访问数据库函数

public class DB
    {
        private static readonly Lazy<DB> lazy = new Lazy<DB>(() => new DB());
        public static DB Instance { get { return lazy.Value; } }

        private readonly IContactService _contactService;

        private DB() { }
        public DB(IContactService contactService)
        {

            _contactService = contactService;
        }
}

将您的DB类更改为:

public class DB {
  private readonly IContactService _contactService;

  public DB(IContactService contactService) {
    _contactService = contactService;
  }
  ...
}
无论您在哪里使用
DB.Instance
,都要将DB作为依赖项注入并使用它。或者使用
Locator.Instance.Resolve()
,尽管使用ServiceLocator被视为反模式(取决于具体情况)


由于您要在DI容器中将DB注册为singleton,因此容器有责任始终返回注入的相同实例。您不需要在DB中编写代码就可以使其成为单例。

您是否也注册了
IContactService
?您是否注册了
ContactService
?请向我们展示
IContactService
的构造函数。是的,它注册为`\u container.RegisterType();`由于其他类也在使用相同的方法,您是如何获得
DB
的实例的?如果您使用的是
实例
属性,那么这将不起作用。那么您的
DB
类就没有使用DI。而是像对
IContactService
一样注入它,并从类中删除静态成员。
public class DB {
  private readonly IContactService _contactService;

  public DB(IContactService contactService) {
    _contactService = contactService;
  }
  ...
}