在我的项目中,我有以下PageCache
实体,它存储在 RavenDB 中:
public class PageCache
{
private readonly IHtmlDocumentHelper htmlDocumentHelper;
public string Id { get; set; }
public string Url { get; set; }
public PageCache(IHtmlDocumentHelper htmlDocumentHelper, string url)
{
this.htmlDocumentHelper = htmlDocumentHelper;
this.Url = url;
}
}
我正在使用 Castle WindsorIHtmlDocumentHelper
在运行时注入实现。这个成员用于PageCache
类内部定义的方法中,为了简单起见,我从上面的代码片段中删除了它。
当我使用构造函数创建PageCache
对象时,一切正常。但在我的代码的其他地方,我PageCache
从 RavenDB 加载对象:
public PageCache GetByUrl(string url)
{
using (var session = documentStore.OpenSession())
{
return session.Query<PageCache>()
.Where(x => x.Url == url)
.FirstOrDefault();
}
}
我的问题是我从 RavenDB 返回的对象没有htmlDocumentHelper
成员集,导致PageCache
依赖它的方法无法使用。
换句话说:当我从存储在 RavenDB 中的文档中加载对象时,它不会使用我的构造函数来构建对象,因此不会通过构造函数注入来初始化私有成员。
我在这里做错了吗?你会如何解决这样的问题?
我最终使用了下面 Ayende 提出的解决方案。我在评论中提到的循环依赖问题仅在我DocumentStore
在 Windsor 中使用UsingFactoryMethod()
. 当我使用WindsorDependsOn()
并直接在.OnCreate()
DocumentStore
Register()
我的容器现在正在初始化如下:
WindsorContainer container = new WindsorContainer();
container.Register(
// Register other classes, such as repositories and services.
// Stripped for the sake of clarity.
// ...
// Register the CustomJsonConverter:
Component.For<CustomJsonConverter>().ImplementedBy<CustomJsonConverter>(),
// The following approach resulted in an exception related to the circular
// dependencies issue:
Component.For<IDocumentStore>().UsingFactoryMethod(() =>
Application.InitializeDatabase(container.Resolve<CustomJsonConverter>()))
// Oddly enough, the following approach worked just fine:
Component.For<IDocumentStore>().ImplementedBy<DocumentStore>()
.DependsOn(new { Url = @"http://localhost:8080" })
.OnCreate(new Action<IDocumentStore>(store =>
store.Conventions.CustomizeJsonSerializer = serializer =>
serializer.Converters.Add(container.Resolve<CustomJsonConverter>())))
.OnCreate(new Action<IDocumentStore>(store =>
store.Initialize()))
.OnDestroy(new Action<IDocumentStore>(store =>
store.Dispose()))
);
虽然它似乎工作正常,但我觉得不得不container.Resolve<CustomJsonConverter>()
从container.Register()
方法内部调用很奇怪。
这是注册依赖项的合法方法吗?