小编dan*_*wig的帖子

将存储库接口作为参数传递给域类上的方法被认为是不好的设计吗?

我们的域名模型现在非常贫乏.我们的实体大多是空壳,几乎完全是为了保存值和导航到集合而设计的.

我们使用EF 4.1代码优先ORM,到目前为止的设计是为了保护我们的新手开发人员免受可怕的"LINQ to Entities无法将blablabla转换为商店表达式"异常在早期迭代期间查询上下文时的异常.

我们在EF上有各种聚合根存储库接口.然而,impls中的一些代码块似乎应该是域的责任.只要在域中声明了存储库接口,并且impl在基础结构中(注入依赖关系),将存储库接口作为参数传递给实体(或其他域)类的方法是否被认为是错误的设计?

例如,这会不好?

public class EntityAbc {
    public void SaveTo(IEntityAbcRepository repos) {...}
    public void DeleteFrom(IEntityAbcRepository repos) {...}
}
Run Code Online (Sandbox Code Playgroud)

如果特定实体需要访问其他聚合根存储库,该怎么办?这样可以吗,为什么?

public void Save() {
    var abcRepos = DependencyInjector.Current.GetService<IEntityAbcRepository>();
    var xyzRepos = DependencyInjector.Current.GetService<IEntityXyzRepository>();
    // work with repositories
}
Run Code Online (Sandbox Code Playgroud)

更新1

我没有提到将代码移动到应用程序层,因为我考虑了一些使用IEntityAbcRepository来涉及业务规则实施的代码.存储库impl应尽可能为vanilla,对吧?它的主要职责应该是对ORM的简单抽象,允许您查找/添加/更新/删除实体.错误?

此外,此问题适用于其他非实体域类的方法 - 工厂,服务,任何模式可能是适当的.重点是,我问的是关于域类的任何方法的问题,而不仅仅是实体类.@Eranga,这是一个可以使用构造函数注入的地方,因为工厂和服务不是ORM的一部分.

然后,应用程序层可以通过将存储库impl注入其构造函数并将其作为参数传递给域服务或工厂来协调流.这是不好的做法吗?

更新2

在这里添加另一个澄清.如果域只需要访问IEntityAbcRepository以执行其Find()方法,该怎么办?在上面的示例中,SaveTo和DeleteFrom方法不会在存储库接口上调用任何添加/更新/删除方法.

到目前为止,为简单起见,我们在单个聚合根存储库接口上组合了fi​​nd/add/update/delete方法.但我想没有什么可以阻止我们将它们分成2个接口,如下所示:

  1. IEntityAbcReadRepository < - 定义所有查找方法签名
  2. IEntityAbcWriteRepository < - 定义所有添加/更新/删除方法sigs

在这种情况下,将IEntityAbcReadRepository作为参数传递给域方法是不好的做法?

domain-driven-design dependency-injection repository entity-framework-4.1

2
推荐指数
1
解决办法
1470
查看次数

如果继承BaseController,则使用OnException的ASP.NET MVC4 Controller无法正常工作

我有一个UsersController,有OnException(有效),但是如果我Controller继承BaseController,OnException那就行不通,即使我把它放进去了BaseController.

基本上我想让我的所有控制器继承,BaseController所以我可以在OnException那里有一个处理程序,它可以捕获所有内容......

asp.net asp.net-mvc aop exception-handling

2
推荐指数
1
解决办法
2702
查看次数

是否最好使用lucene KeywordAnalyzer为自动建议文本框索引文本?

我在搜索表单中有一个文本框,我想附加一个组合框/自动完成小部件.在用户输入时,我想自动建议相关的地名.因此,如果用户输入"Ca",建议柬埔寨,喀麦隆,加拿大,佛得角等,排名高于北卡罗来纳州和南卡罗来纳州.如果用户输入"海",返回红海,黑海等物品,但也许不是切尔西(如果有的话,应该得分较低).我们的地名数据库非常精细和复杂,有很多数据和很多地方的替代名称/翻译.数据存储在SQL Server中,我们使用Entity Framework作为数据访问层.不用说,Places使用LINQ to Entities 有效地查询我们的实体聚合是缓慢且低效的.

我正在研究Lucene.Net,而不是雕刻自定义SQL和索引以优化数据库搜索.今天是我测试它的第一天.大多数Lucene帮助我读过使用a StandardAnalyzer来索引.我在几次测试中使用它时遇到了一些麻烦.例如,请考虑以下事项:

var searchTerms = new[] { "Ca", "China", "Sea", };
searchTerms = searchTerms.Concat(searchTerms.Select(x => x.ToLower())).ToArray();
var reader = IndexReader.Open(_directory, true);
foreach (var searchTerm in searchTerms)
{
    var searcher = new IndexSearcher(reader);
    var query1 = new WildcardQuery(new Term("OfficialName", string.Format("*{0}*", searchTerm)));
    var query2 = new TermQuery(new Term("OfficialName", searchTerm));
    var query3 = new QueryParser(Version.LUCENE_30, "OfficialName", new SimpleAnalyzer()).Parse(searchTerm);
    var query4 = new PrefixQuery(new Term("OfficalName", searchTerm));
    var query5 = new BooleanQuery();
    query5.Add(query1, Occur.SHOULD);
    query5.Add(query2, Occur.SHOULD); …
Run Code Online (Sandbox Code Playgroud)

lucene lucene.net

2
推荐指数
1
解决办法
4976
查看次数

Slack 应用程序在先前的模式提交后打开新模式不一致,为什么?

我创建了一个新的免费 Slack 工作区来学习 Slack 机器人应用程序 API。我有一个动作处理程序,它监听全局快捷方式并打开一个输入模式作为响应。还有另一个操作处理程序,它侦听模态输入 Submit callback_id,执行一些工作,然后使用trigger_id打开另一个模态。

app.view('do_thing_b.submit', async (slack) => {

  try {
    await slack.ack()
    console.info(`Received modal submit`)

    // TODO: actual work to save the data

    const view = {
      type: 'modal',
      callback_id: 'do_thing_b.received_submission',
      title: {
        text: 'Thing B Done',
        type: 'plain_text',
      },
      blocks: [
        {
          type: 'section',
          text: {
            text: 'My Plain Text',
            type: 'plain_text',
            emoji: true,
          },
        },
      ],
      close: {
        text: 'Close',
        type: 'plain_text'
      }
    }

    const openViewParams = {
      trigger_id: slack.body.trigger_id, …
Run Code Online (Sandbox Code Playgroud)

modal-dialog view submit slack-api slack-block-kit

2
推荐指数
1
解决办法
2175
查看次数

JavaScript和JQuery中的Keypress事件?

我自己制作HTML幻灯片,并且能够创建大部分内容.我被卡住的地方是键盘事件.那是向前和向后的箭头.我需要知道如何使用JavaScript或JQuery处理这些问题.按下这些按钮会触发事件,以便移动到下一张幻灯片或转到上一张幻灯片.我还想提一下,我的幻灯片也是交互式HTML,因为你可以使用它们填写数据,验证等.因此,当用户通过键盘与页面上的表单或其他内容进行交互时,我不希望键盘事件发生阻碍(例如,填写表格,日期等).怎么去这个?

javascript jquery

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

在自定义RoleProvider中首先使用EF代码导致许多数据访问异常的原因是什么?

我的角色提供者看起来像下面的类(删节).我在VS 2012上运行IIS Express和SQL 2012 Express,我在这个角色提供程序代码中得到了许多看似随机的异常.

public class Educ8RoleProvider : RoleProvider
{
    private readonly Educ8DbContext _dbContext = new Educ8DbContext();
    private readonly Authorization _authorization;
    public Educ8RoleProvider()
    {
        _authorization = new Authorization(_dbContext);
    }
    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
    {
        try
        {
            base.Initialize(name, config);
        }
        catch (Exception ex)
        {
            ErrorSignal.FromCurrentContext().Raise(ex);
            throw;
        }
    }
    public override bool IsUserInRole(string username, string roleName)
    {
        return GetRolesForUser(username).Any(r => r.ToLower() == roleName);
    }
    public override string[] GetRolesForUser(string username)
    {
        return _authorization.GetRolesForMember(username).Select(r => r.Name).ToArray();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我Authorization …

asp.net-mvc entity-framework roleprovider ef-code-first asp.net-mvc-4

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

如何使用AutoMapper"膨胀"实体

我在我的web api项目中收到了一个DTO,我想使用AutoMapper自动将我的DTO转换为我插入数据库的实体.

以下是DTO和实体的简化:

class RegistrationDTO
{
    string name;
    ICollection<int> Departments;
}

class Registration
{
    int id;
    DateTime CreatedAt;
    string name;
    virtual ICollection<Department> Departments;
}

class Department
{
    int id;
    string name;
    virtual ICollection<Registration> Registrations;
}
Run Code Online (Sandbox Code Playgroud)

问题是RegistrationDTO只有部门的ID,我找不到让AutoMapper从数据库中获取部门的方法(使用Entity Framework 5).

使用自定义ValueResolver我可以将一个int列表转换为Departments列表,但是我想从数据库中获取Departments,而不是创建新的Departments.

这是我提出的解决方案,但我很确定有更好的方法:

var reg= Mapper.Map<Registration>(dto);

reg.Departments = new List<int>(dto.Departments).ConvertAll(input => Context.Departments.Find(input));

if(reg.Departments.Contains(null)) //a department provided does not exist in the database
    return Request.CreateResponse(HttpStatusCode.BadRequest, "invalid department");

...
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决这个问题吗?

c# entity-framework automapper asp.net-web-api

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

图像的奥秘

所以我正在开发一个模型视图控制器(MVC)项目.由于规模和复杂性,我正在努力确保组织.我成功地遇到了一个独特的困境,一个让我很难过的困境.我的问题来自我正在整合到我的网站的Jquery Rotator.

My Solution Explorer:

  • 内容:这种特殊的文件夹中包含三个直接的子文件夹 Images,ScriptsStylesheets.

这三个子文件夹包含更具体和更细致的细节,一个例子是Scripts包含另一个Rotator为此jQuery实现调用的文件夹.

所以这种困境发生在View中.

视图中的示例:

<div class = "banner-style">
     <div id = "Infinite-Banner">
          <div class = "banner-container">
                <div class = "slides">
                      <img src = "~/Content/Images/Banner/Slides/One.jpg">
                      <img src = "~/Content/Images/Banner/Slides/Two.jpg">
                </div>
          </div>
     </div>
</div>
Run Code Online (Sandbox Code Playgroud)

因此,在此结构中,它似乎不会加载图像.虽然它已正确映射到目录.但是,如果您使用上面相同的结构,但将img部分更改为:

<div class = "slide-one" />
<div class = "slide-two" />
Run Code Online (Sandbox Code Playgroud)

然后在相关的样式表中,只需background: url(~/Content/Images/Banner/Slides/One.jpg);为 …

c# asp.net asp.net-mvc asp.net-mvc-4

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

如何在VS 2012中启用CSS编辑器功能?

我似乎错过了VS 2012 RC中所有酷炫的CSS编辑器功能.例如,颜色选择器.是因为我使用评估版吗?或者是否有一个开关在发布中打开它们?

css-editor visual-studio-2012

0
推荐指数
1
解决办法
6648
查看次数