仅依赖注入和加载应用程序设置一次

时间:2015-10-11 05:29:55

标签: c# dependency-injection unity-container

我有一个自定义类 - " ApplicationConfigurationManager",这取决于我的IDataRepository。当然,接口在另一个程序集中有一个具体的实现。所以基本上我们有:

Business dll
 ApplicationConfigurationManager
 IDataRepository

EfDatabaseAccess dll
 EfDataRepository : IDataRepository

Client.exe
  ref EfDatabaseAccess dll
  ref Business dll

我希望ApplicationConfigurationManager只为整个应用程序运行时生命(即Singleton)初始化一次,因为它通过IDataRepository命中数据库。与此同时,我希望IDataRepository能够通过Unity解析为EfDataRepository。

两个人在一起玩得不好。如果依赖于Unity来解决其依赖关系,我如何让某些类保持活着状态。

2 个答案:

答案 0 :(得分:1)

您应该在Unity中使用Lifetime Managers来控制每个注册类型的生命周期。在您的情况下,它将如下所示:

GridView.DataSource = manager;
GridView.DataBind();

答案 1 :(得分:0)

我假设您想要Logger.Log("Some text")之类的东西,但仍然可以使用Unity设置并正确解析依赖关系。

您可以在注册界面时使用Unity自动注册Func<IMyInterface> - 使用Func版本可以在初始化调用时使用它来解析对象。

public static Func<IDbLogger> LoggerGetter {get;set}
public static static Log(string text)
{
    LoggerGetter().Log(text); // will resolve `IDbLogger` at this point
}

....
// during container initialization:
container.Register<IDbLogger>(....);
Logger.LoggerGetter = container.Resolve<Func<IDbLogger>>();

注意:

    由Unity容器创建的
  • Func<IMyInterface>基本上是()=>container.Resolve<IMyInterface>(),所以如果你想要,你可以改为传递这样的lambda。缺点是,如果直接使用lambda(很少需要),则不能覆盖Func<IMyInterface>的注册。
  • 这篇文章不涉及使用单身是好/坏主意 - 自己打电话
  • 当依赖于彼此的对象的生命周期不匹配时(即,应用程序和调用,或HttpRequest和Invocation),可以使用相同的技术。要解决具有更长生命周期的对象,应该依赖Func<...>提供其他对象并在需要时调用它。