管理UnitOfWork的AutoFac对象创建

时间:2016-04-25 01:11:51

标签: asp.net-web-api architecture repository autofac unit-of-work

我是架构新手,我正在学习和设计端到端的应用程序。我有以下架构,并使用Autofac来管理对象创建。

enter image description here

所有businessobject合同都已在webapi启动时设置,这是唯一可以实际启动所有autofac配置/模块的启动。

我使用UnitOfWork / Repository模式并且它超出了我的业务层,我不想在我的WebAPi中引用UnitOfWork,但我无法启动UnitOfWork。

有人可以就我的架构/设计/ autofac unitofwork实施应该给我一些意见吗?

1 个答案:

答案 0 :(得分:1)

在App_start中注册Web项目特定的依赖项(控制器等)。在BL层中有一个静态方法,它注册工作单元,存储库等。当所有Web依赖项都被注册时,在App_start中调用这个静态方法:

//App_Start (web project)
var builder = new ContainerBuilder();
var config = GlobalConfiguration.Configuration;
MyProject.BusinessLayer.RegisterDependancies.Register(builder); <-- Register Unit of Work here in static BL method
builder.RegisterControllers(typeof(MvcApplication).Assembly);
builder.RegisterApiControllers(typeof(MvcApplication).Assembly);
builder.RegisterModule<AutofacWebTypesModule>();
builder.RegisterWebApiFilterProvider(config);
builder.RegisterModule(new AutofacModules.AutoMapperModule());
builder.RegisterModule(new AutofacModules.Log4NetModule());

var container = builder.Build();

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);


//Static method in BL
namespace MyProject.BusinessLayer
{
    public static class RegisterDependancies
    {
        public static void Register(ContainerBuilder builder)
        {
            builder.RegisterType<MyContext>().As<IDataContextAsync>().InstancePerLifetimeScope();
            builder.RegisterType<UnitOfWork>().As<IUnitOfWorkAsync>().InstancePerLifetimeScope();
            builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepositoryAsync<>)).InstancePerLifetimeScope();
            builder.RegisterAssemblyTypes(typeof(BusinessService).Assembly).Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerLifetimeScope();
        }
    }
}