如果接口使用Autofac

时间:2018-12-31 13:13:21

标签: c# dependency-injection inversion-of-control autofac

我在项目中使用了以下架构模式,而对于依赖项注入容器,我使用了Autofac,它可以如下正常工作:

enter image description here

并使用以下代码注册程序集

builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
   .Where(t => t.Name.EndsWith("Repository"))
   .AsImplementedInterfaces()
   .InstancePerRequest();
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
   .Where(t => t.Name.EndsWith("Service"))
   .AsImplementedInterfaces()
   .InstancePerRequest();
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
   .Where(t => t.Name.EndsWith("Entity"))
   .AsImplementedInterfaces()
   .InstancePerRequest();
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
   .Where(t => t.Name.EndsWith("Controller"));

但是,如果我使用以下架构模式,那么它将无法正常工作,它将无法解决依赖性。

enter image description here

1)是否可以将这种模式用于控制/依赖注入的反转?

2)如果是,那么如何注册程序集?

注1:-GUI层仅具有接口程序集的引用,而没有具体类程序集的引用。

注意2:-并且我已经检查了bin文件夹中的具体类程序集不存在

注意3:-箭头显示了程序集的引用

注意4:-出现以下错误 Error Picture

1 个答案:

答案 0 :(得分:0)

我不知道这是一个可靠的解决方案还是解决方法

如果将具体类及其接口放在同一项目/程序集中并引用该项目,则Autofac不会存在依赖项解析问题,因为它具有接口和类

但是

如果您将具体的类和相关的接口放在单独的项目/程序集中,那么您仅引用接口项目/程序集而不是具体的类/程序集来实现

固体

然后出现问题,因为您仅引用了接口,因此dot net不会将具体类的Assembly(dll)移动到用户界面项目的(asp.net mvc)执行文件夹中,并且Autofac不能解决依赖关系

现在我要解决的方法是,在类库项目的后生成事件中,放置一个命令将每个类库项目的程序集(dll文件)复制到用户界面(asp.net mvc)bin文件夹中,如下所示

Copy command in post build project

然后使用以下代码在Autofac中加载和注册程序集

        AppDomain.CurrentDomain.Load("WsafEntities");
        AppDomain.CurrentDomain.Load("WsafEntitiesInterfaces");

        AppDomain.CurrentDomain.Load("WsafDACs");
        AppDomain.CurrentDomain.Load("WsafDACsInterfaces");

        AppDomain.CurrentDomain.Load("WsafRepositories");
        AppDomain.CurrentDomain.Load("WsafRepositoriesInterfaces");

        builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies().Where(t => t.FullName.Contains("Wsaf")).ToArray())
            .AsImplementedInterfaces();

        builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
            .Where(t => t.Name.EndsWith("Controller"));