使用Autofac的接口,业务逻辑和global.asax

时间:2013-07-05 15:06:32

标签: c# asp.net .net autofac n-tier-architecture

我正在试图弄清楚分离应该如何与ASP.NET和依赖注入一起使用。

我有四个项目:

  • ASP.NET客户端
  • BusinessLogic类lib(BL)
  • 集成类lib,调用服务引用
  • 共享(接口,型号)

在Integration中我有一个存储库,它调用其他服务。存储库“MyRepository”实现了一个接口“IMyRepository”,它放在Shared中,并返回同样放在Shared中的对象。

严格来说,我不喜欢客户端对Integration-project的引用/依赖,但所有通信都应该通过BL进行。

在客户端的Global.asax中,我使用Autofac注册我的类型

var builder = new ContainerBuilder();
builder.RegisterModule(new AutofacWebTypesModule());
builder.RegisterControllers(typeof(MvcApplication).Assembly);
builder.RegisterType<MyRepository>().As<IMyRepository>().InstancePerHttpRequest();

但是,这需要Client-project引用Integration-project来实现MyRepository。应该这样吗?

我怎样才能从客户端到集成的引用并保持分离清洁?

我的真实世界项目规模远大于此,所以我试图解开依赖项。

谢谢你的时间!

1 个答案:

答案 0 :(得分:2)

我的正常做法是:

  1. 定义一种在每个程序集中发现类型的方法。最简单的方法(如果你不介意在每个方法中引用Autofac)是在每个程序集中放置一个Autofac Module。如果您不喜欢这样,您可以定义自己的发现抽象(例如,类似MEF的属性)。

  2. 发现所有装配体。最简单的方法是扫描bin文件夹,但您可以使用一些自定义配置。我没有检查最新版本的Autofac在模块发现方面添加任何东西,但之前我是手动完成的。

  3. 使用先前定义的类型发现方法从每个发现的程序集中注册所有相关类型。