Asp.net mvc 3 等待满足的依赖关系
我试图为一些非常简单的对象抽象一些简单的任务 在我的域模型中,有许多不同的对象基本上是作为标记(分类)一个“程序”的方式。业务逻辑说,一个程序可以有它想要的任意多个对象,但是没有相同类型的标记(例如,“County”)可以有相同的名称,并且当它有程序链接到它时,你不能删除一个标记 这是基于MVC3和S#arp 2.0构建的 域模型有一个抽象基类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;} 在其他属性中 特定类型扩展该类以添加使其唯一的任何内容(如果有的话),例
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项目中的每个接口和实现,您的查询接口和实现是否在此项目中?