我有一个自定义类 - " 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来解决其依赖关系,我如何让某些类保持活着状态。
答案 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>>();
注意:
Func<IMyInterface>
基本上是()=>container.Resolve<IMyInterface>()
,所以如果你想要,你可以改为传递这样的lambda。缺点是,如果直接使用lambda(很少需要),则不能覆盖Func<IMyInterface>
的注册。Func<...>
提供其他对象并在需要时调用它。