4

在我的项目中,我有以下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()DocumentStoreRegister()

我的容器现在正在初始化如下:

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()方法内部调用很奇怪。

这是注册依赖项的合法方法吗?

4

1 回答 1

2

克里斯蒂安,我们不能使用你的 ctor,我们不知道在里面放什么。

相反,您可以使用此技术告诉 RavenDB 如何创建对象:http: //james.newtonking.com/projects/json/help/CustomCreationConverter.html

然后你可以使用 documentStore.Conventison.CustomizeSerializer 连接它

于 2012-05-19T11:47:08.877 回答