Asp.net mvc 3 等待满足的依赖关系

Asp.net mvc 3 等待满足的依赖关系,asp.net-mvc-3,castle-windsor,s#arp-architecture,Asp.net Mvc 3,Castle Windsor,S#arp Architecture,我试图为一些非常简单的对象抽象一些简单的任务 在我的域模型中,有许多不同的对象基本上是作为标记(分类)一个“程序”的方式。业务逻辑说,一个程序可以有它想要的任意多个对象,但是没有相同类型的标记(例如,“County”)可以有相同的名称,并且当它有程序链接到它时,你不能删除一个标记 这是基于MVC3和S#arp 2.0构建的 域模型有一个抽象基类NamedEntity:Entity,它定义 公共字符串名称{get;set;} 在其他属性中 特定类型扩展该类以添加使其唯一的任何内容(如果有的话),例

我试图为一些非常简单的对象抽象一些简单的任务

在我的域模型中,有许多不同的对象基本上是作为标记(分类)一个“程序”的方式。业务逻辑说,一个程序可以有它想要的任意多个对象,但是没有相同类型的标记(例如,“County”)可以有相同的名称,并且当它有程序链接到它时,你不能删除一个标记

这是基于MVC3和S#arp 2.0构建的

域模型有一个抽象基类
NamedEntity:Entity
,它定义
公共字符串名称{get;set;}
在其他属性中

特定类型扩展该类以添加使其唯一的任何内容(如果有的话),例如Topic,它是继承人架构结构,因此具有该结构的附加属性

我想创建
INamedEntityTasks,其中T:NamedEntity
,然后有一个基本版本,用于处理常规任务,如
bool CheckForDuplicateName(字符串名称)
,它将运行access其
inamedentityquerys
对象并调用
T FindByName(字符串名称)

如果子类需要在删除之前添加更多规则(例如,不能删除包含子类的主题),那么它只会覆盖基类中的虚方法

结构:

  • MyProject.Infrastructure
    具有
    INamedEntityQueries
    NamedEntityQueries
    以及
    ITopicQueries:INamedEntityQueries
    TopicQueries:NamedEntityQueries,ITopicQueries
  • MyProject.Domain.Contracts.Tasks
    具有
    inamedentityttasks
    ITopicTasks:inamedentityttasks
  • MyProject.Tasks
    具有
    NamedEntityTasks
    TopicTasks:NamedEntityTasks,ITopicTasks
我的
TopicsController
无法运行,因为我无法找出缺少依赖项

确切的例外是

无法创建组件 'MyProject.web.mvc.controllers.topicscontroller' 因为它有依赖关系 满意的。 MyProject.web.mvc.controllers.topicscontroller 正在等待以下消息 依赖项:

服务: -MyProject.Infrastructure.Queries.ITopicQueries 没有注册。 -MyProject.Domain.Contracts.Tasks.ItoPictTasks 这是注册的,但也是 等待依赖项

MyProject.Tasks.TopicTasks正在等待 对于以下依赖项:

服务: -MyProject.Infrastructure.Queries.InamentityQueries`1[[MyProject.Domain.Topic, MyProject.Domain,版本=1.0.0.0, 区域性=中性,PublicKeyToken=空]] 没有注册

我在
componentregister
中用断点检查了
容器
,它显示了3个可能的错误配置:

"MyProject.Tasks.NamedEntityTasks`1" NamedEntityTasks`1
"MyProject.Tasks.TopicTasks" ITopicTasks / TopicTasks
"MyProject.web.mvc.controllers.topicscontroller" TopicsController`TopicsController`

任何帮助都将不胜感激。

您不需要IFooTasks接口,只需使用抽象基类,IFooBarTasks和iFooBazaTasks将由S#arp体系结构中的标准组件注册器向Castle Windsor注册:

public abstract class Foo
{
  public void Foo1();

  public void Foo2();
}

public class FooBar : Foo
{
  public void FooBar1();
}

public class FooBaz : Foo
{
  public void FooBaz1();
}

public interface IFooTasks
{
  void Foo1();

  void Foo2();
}

public interface IFooBarTasks : IFooTasks
{
  void FooBar1();
}

public interface IFooBazTasks : IFooTasks
{
  void FooBaz1();
}

public abstract class FooTasks : IFooTasks
{
  public void Foo1()
  {
    // Foo1 implementation
  }

  public void Foo2()
  {
    // Foo2 implementation
  }
}

public class FooBarTasks : FooTasks, IFooBarTasks
{
  public void FooBar1()
  {
    // FooBar1 implementation
  }
}

public class FooBazTasks : FooTasks, IFooBazTasks
{
  public void FooBaz1()
  {
    // FooBaz1 implementation
  }
}

问题很长。。。你能缩小范围吗?或者理想情况下,只提供一个失败的测试?我的测试项目当前不会加载。。。MyProject.Tests.MyProject.Tasks.CategoryTasksTests.CanConfigrmDeleteReadiness:SetUp:System.NullReferenceException:ServiceLocator尚未初始化;我试图检索SharpArch.NHibernate.ISessionFactoryKeyProvider-->System.NullReferenceException:对象引用未设置为对象的实例。@Carl:您可以专门为此创建另一个问题来缩小问题的范围:如果您有抽象类Foo,以及子类FooBar和FooBaz,这两个类仅略有不同,通过定义接口
IFooTasks,其中T:Foo
并实现它,然后定义接口
IFooBarTasks:IFooTasks
(等)并实现它们,编写在Foos上运行的任务是否可能且可取?如果这是可能的,你如何让温莎城堡很好地处理这一切?新的问题产生了。。。除了我的基本任务/查询不是抽象的之外,这几乎就是我所拥有的。我将它们抽象化了,但仍然得到一个错误,即MyProject.Tasks.TopicTasks正在等待以下依赖项:MyProject.Infrastructure.Queries.ITopicQueries,它未注册。在我的单元测试中:
private ITopicTasks TopicTasks=new TopicTasks(new-NHibernateRespository(),new-TopicQueries())在TopicTasks.cs
公共TopicTasks(INHibernateRepository topicRepository,ITopicQueries neQueries):base(topicRepository,neQueries){}
听起来像是通过Windsor而不是您的代码创建的TopicTasks:
私有ITopicTasks TopicTasks=新TopicTasks(new NHibernateRepository()),新主题查询())对,测试不是问题实际上,我应该抓住控制器代码:
公共TopicsController(ITopicQueries topicQueries,ITopicTasks topicTasks)
这是一个不起作用的方法。ComponentRegister中的AddQueryObjectsTo方法将注册Web/Presentation项目中的每个接口和实现,您的查询接口和实现是否在此项目中?