【问题标题】:Managing AutoFac object creation for UnitOfWork管理 UnitOfWork 的 AutoFac 对象创建
【发布时间】:2016-04-25 01:11:50
【问题描述】:

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

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

我使用 UnitOfWork/Repository 模式,它位于我的业务层之外,我不想在我的 WebAPi 中引用 UnitOfWork,但我无法启动 UnitOfWork。

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

【问题讨论】:

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


【解决方案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();
        }
    }
}

【讨论】:

  • 你是一个绝对的传奇:)
  • @immortal 这是你想要的,但这完全是在扼杀 IoC 逻辑。
  • @ErkanDemirel 我现在没有更好的方法。除非你能建议。
  • @ErkanDemirel 为什么这会扼杀 IoC?同一个容器被传递给静态方法,所以所有生命周期都由同一个容器处理,至少我认为但也许我错了?
  • @garethb 你有一个组合根,但它遵守业务层的规则,所以它不是规则制定者。同样通过这种实现,您可以使存储库和业务耦合(即使它们使用接口)。如果您更改存储库上的实施,驱动程序项目(Web api)应该知道并且您不必构建/部署/更改任何其他内容。但是现在如果您更改存储库,您应该重建/部署/更改业务层。在小项目中你看不到缺点,但在大项目中,或者如果项目变得更大,这就会产生问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多