小编Gir*_*ffe的帖子

存储库模式:如何延迟加载?或者,我应该拆分这个Aggregate吗?

我有一个具有编辑器和项目概念的域模型.

编辑拥有许多项目,项目不仅有编辑所有者,还有许多编辑成员.因此,编辑还有一些"加入"项目.

我正在采用DDD方法对此进行建模并使用Repository模式进行持久化.但是,我还没有足够好地确定模式,以确定我应该如何做到这一点.

我正在假设编辑器和项目可能在同一个聚合中,其中根是编辑器.因此,我可以获得一个编辑器,然后枚举其项目,并可以从那里枚举项目的成员编辑.

但是,如果我只被允许从我的存储库中检索编辑器,这是不是意味着当我获得拥有它们的编辑器时我必须从存储库加载所有项目?如果我想延迟加载成员编辑器,项目还需要对存储库的引用?

或者,如果我拆分聚合并拥有一个编辑器存储库和一个项目存储库,那么我应该如何处理两者之间的事务,例如将新项目添加到编辑器中?例如:

Editor e = new Editor("Editor Name");
editorRepository.Add(e);

Project p = e.CreateProject("Project Name");
projectRepository.Add(p);    // These two lines
editorRepository.Save(e);    // should be atomic
Run Code Online (Sandbox Code Playgroud)

我是否误解了Repository模式的意图?

domain-driven-design aggregate lazy-loading ddd-repositories repository-pattern

40
推荐指数
2
解决办法
9923
查看次数

在链接文本中使用HTML元素创建ActionLink

在ASP.NET MVC视图中,我想要包含以下形式的链接:

<a href="blah">Link text <span>with further descriptive text</span></a>
Run Code Online (Sandbox Code Playgroud)

试图将<span>元素包含在linkText调用字段中以Html.ActionLink()最终编码(如预期的那样).

有没有推荐的方法来实现这一目标?

asp.net-mvc actionlink

34
推荐指数
2
解决办法
3万
查看次数

对HTTP POST请求的正确响应是什么?

对于POST方法,W3规范说:

如果在源服务器上创建了资源,则响应应该是201(已创建)并包含描述请求状态的实体,并引用新资源和Location头(请参阅第10.4节).

http://www.ietf.org/internet-drafts/draft-ietf-httpbis-p2-semantics-05.txt(8.5节)

标准响应实际上似乎是将重定向发送到新创建的资源.

我正在使用ASP.NET MVC构建我的站点,并尝试遵循规范,因此创建了一个ResourceCreatedResult类:

public class ResourceCreatedResult : ActionResult
{
    public string Location { get; set; }
    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.Clear();
        context.HttpContext.Response.StatusCode = 201;
        context.HttpContext.Response.ClearHeaders();
        context.HttpContext.Response.AddHeader("Location", Location);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的行为看起来像这样:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreateNew(string entityStuff)
{
    Entity newEntity = new Entity(entityStuff);
    IEntityRepository entityRepository = ObjectFactory.GetInstance<IEntityRepository>();
    entityRepository.Add(newEntity);

    ActionResult result = new ResourceCreatedResult()
        { Location = Url.Action("Show", new { id = newEntity.Id }) };
    return result;
}
Run Code Online (Sandbox Code Playgroud)

但是,IE,Firefox和Chrome都无法重定向到新资源.我是否搞砸了生成正确的响应,或者网络浏览器不期望这种类型的响应,而是依靠服务器发送重定向响应?

asp.net-mvc http http-headers

31
推荐指数
3
解决办法
4万
查看次数

如何使用TaskFactory.FromAsync和自定义异步过程创建任务

我试图测试一些依赖于Task进行一些后台计算的类(从网络位置检索数据).该类获取一个未启动的Task实例,添加一个ContinueWith方法,然后在Task上调用Start.像这样的东西:

private void Search()
{
    Task<SearchResults> searchTask = m_searchProvider.GetSearchTask(m_searchCriteria);
    searchTask.ContinueWith(OnSearchTaskCompleted);
    searchTask.Start();
}
Run Code Online (Sandbox Code Playgroud)

该类通过接口获取Task的实例,因此我能够注入我的测试所控制的Task实例.但是,我似乎无法创建一个我有足够控制权的人.

我不想在测试中引入线程,但仍希望使Task以异步方式运行,所以我试图做的是编写一个实现BeginInvoke/EndInvoke模式的类而不进行线程化,并使用TaskFactory.FromAsync方法创建任务.

想法是测试可以在启动任务的类上调用方法,然后当返回测试时,可以将结果数据提供给Async对象,该对象在保持同一线程的同时完成操作.

但是,当我尝试在该任务上调用Start时,我收到一条错误消息,指出"可能无法在具有空操作的任务上调用Start".不幸的是,谷歌对这条消息没什么帮助,所以我不确定我是否错误地实现了我的Async对象,或者错误地使用了TaskFactory.FromAsync.这是我的NonThreadedAsync类的代码和一个异常的测试:

public class NonThreadedAsync<TResult>
{
    private NonThreadedAsyncResult<TResult> m_asyncResult;

    public IAsyncResult BeginInvoke(
        AsyncCallback callback,
        object state)
    {
        m_asyncResult = new NonThreadedAsyncResult<TResult>(callback, state);
        return m_asyncResult;
    }

    public TResult EndInvoke(IAsyncResult asyncResult)
    {
        return m_asyncResult.GetResults();
    }

    public void Complete(TResult data)
    {
        m_asyncResult.CompleteAsync(data);
    }
}

public class NonThreadedAsyncResult<TResult> : IAsyncResult
{
    private readonly AsyncCallback m_asyncCallback;
    private readonly object m_state;
    private readonly ManualResetEvent m_waitHandle;
    private bool m_isCompleted;
    private TResult m_resultData;

    public …
Run Code Online (Sandbox Code Playgroud)

.net task-parallel-library taskfactory c#-4.0

4
推荐指数
1
解决办法
6665
查看次数