我使用StructureMap DI模式在ASP.NET MVC中开发Web应用程序,以从BAL到UI检索数据,并使用分层架构模式从DAL检索数据到BAL。发现我的班级图。
所以,我厌倦了将StructureMap服务寄存器配置为
public class Bootstrapper
{
public static void Initialize()
{
StructureMapConfiguration.AddRegistry(new ServiceRegistry());
}
public class ServiceRegistry : Registry
{
protected override void configure()
{
ForRequestedType<IVehicleService> ().TheDefaultIsConcreteType<VehicleService>();
}
}
}
但是,配置未正确应用,发生错误并说“在接口类中找不到某些方法”。当然,它是正确的。因为在我的BAL类中从DAL继承了一些方法/函数。 所以,请帮我解决这个问题,或者给出任何最佳实践来应用我的项目。
答案 0 :(得分:4)
我建议您重新考虑课程的组织方式,并尝试应用Dependency Inversion Principle。您构建类的方式,您的UI项目将取决于您的BAL项目,这将取决于您的DAL项目。您希望您与数据库(在DAL中)交谈的具体细节依赖于抽象(在您的BAL中),而不是相反。您可以通过实现Onion Architecture(也就是端口和适配器或六边形体系结构)轻松实现此目的。我有a brief online course covering converting from a traditional N-tier architecture (like yours) to this approach。
另外,我认为您打算在类图中使用Repository模式,而不是Respiratory。您也可以看到一种简单的入门方式resolving dependencies using StructureMap in ASP.NET MVC 5。
一旦建立了这种架构,事情变得非常简单。如果一致地命名接口,则可以使用StructureMap的WithDefaultConventions()方法来消除将每个具体类型注册到其关联接口的需要。例如,您可以定义IVehicleRepository(在您的Core项目中)及其实现VehicleRepository(在您的Infrastructure项目中,它引用Core)。此时,在您配置StructureMap的UI项目中,您的控制器可以在其构造函数中简单地请求IVehicleRepository,而StructureMap将使用您的VehicleRepository实现来满足此类请求(除非您将其配置为其他方式)。
答案 1 :(得分:1)
不要覆盖&#34; configure()&#34;方法,但在Registry类的构造函数中进行注册。
似乎您可能正在使用早期版本的StructureMap,因为注册语法在更新版本中更为简洁。
源代码中有很多例子: