如何避免不断更新,添加自定义Autofac构建容器类的代码?

问题描述 投票:-1回答:1

我正在将Autofac用于C#Windows控制台应用程序。我的控制台应用程序解决方案的项目层详细信息如下。

步骤1:我创建了一个自定义Microsoft Entity Framework数据库上下文类和存储库类

// custom C# Entity Framework database context named MyDbContext that inherits Entity Framework  DbContext class.
public class MyDbContext: DbContext { }

// custom C# repository class named MyRepository that implements IMyRepository interface.
public class MyRepository: IMyRepository{ }

public interface IMyRepository { }

第2步:我有一个单独的C#库项目

具有C#业务类的C#库。此C#库项目的程序集名称为“ MyBusinessAssembly”。在这个库项目中,我有一些带有参数构造函数的C#自定义业务类:

public class BusinessA: IBusinessA { 
    private readonly DbContext context;
    private readonly IMyRepository repository; 

    public BusinessA(DbContext ctx, IMyRepository rep){
         context = ctx;
         repository = rep;
    }
    ... 
}
public interface IBusinessA {...}

public class BusinessB: IBusinessB { 
    private readonly DbContext context;
    private readonly IMyRepository repository; 

    public BusinessB(DbContext ctx, IMyRepository rep){
         context = ctx;
         repository = rep;
    }
    ... 
}

public interface IBusinessB {...}


public class BusinessC: IBusinessC { 
    // Note: this business class uses the 2 business classes above as dependency injection

    private readonly DbContext context;
    private readonly IMyRepository repository; 
    private readonly IBusinessA businessA;
    private readonly IBusinessB businessB;

    public BusinessC(DbContext ctx, IMyRepository rep, IBusinessA bA, IBusinessB bB){  // *********************************** (LINE 1)
         context = ctx;
         repository = rep;
         businessA = ba;
         businessB = bB;
    }
    ... 
}

public interface IBusinessC {...}

步骤3:我还有另一个单独的C#库项目。该项目引用了上述第2步中C#库项目中的DDL文件]

在此项目中,我创建了一个自定义Autofac构建容器类,其中包含以下详细信息

public class MyContainer {
     public static IContainer BuildContainer()
        {            
            var container = new ContainerBuilder();

            // register Entity Framework Db context
            container.RegisterType<MyDbContext>()
                .As<DbContext>()
                .InstancePerDependency();

            // register my custom repository concrete class and its interface
            container.RegisterType<MyRepository>()
                .As<IMyRepository>()
                .InstancePerDependency();


           // Note: right now I have to register service class ServiceC as following with explicitly codes of object instantiations

            var myDbContext = new MyDbContext();
            var myRepository = new MyRepository(myDbContext);

            var businessA = new BusinessA(myDbContext, myRepository);
            var businessB = new BusinessB(myDbContext, myRepository);

            // Now, I have to instantiate BusinessC object register its type as following
            var businessC = new BusinessC (myDbContext, myRepository, businessA, businessB);      // ***********************************  (LINE 2)


            container.Register<IBusinessC>(x => businessC)
                .InstancePerDependency();           

            return container.Build();                    
        }

}

如果要从第2步库项目中的BusinessC类需要一个新的业务类(例如IBusinessD),将来会出现MyContainer类的代码问题,BusinessC的参数构造函数必须另外包含一个依赖注入(DI)参数,如下所示:(请参阅// **************************** *******(第1行的第2行)

注意:我可以用IBusinessD的另一个DI参数扩展BusinessC的构造函数。

public class BusinessC: IBusinessC
{
    ... 
    private readonly IBusinessD businessD; // new code line

    // add one more DI paramter IBusinessD bD to the constructor of BusinessC class:
    public BusinessC(DbContext ctx, IMyRepository rep, IBusinessA bA, IBusinessB bB, IBusinessD bD){  // *********************************** (LINE 1)
         context = ctx;
         repository = rep;
         businessA = ba;
         businessB = bB;
         businessD = bD; // new code line
    }
}

现在,我必须返回到上面的步骤3,如下所述修改步骤3中的MyContainer类。我不能继续添加,更新如下指定代码行之类的代码。

public class MyContainer {
     public static IContainer BuildContainer()
        {  
            ...

            // Note: I am not OK with keeping adding codes like following whenever BusinessC needs a new business class such as BusinessD. How can I avoid keeping adding codes like this?
            var businessD = new BusinessD(myDbContext, myRepository); // new code line

            // Note: I am not OK with keeping updating codes like following. How can I avoid keeping updating codes like this?
            var businessC = new BusinessC (myDbContext, myRepository, businessA, businessB, businessD); // updated with argument called businessD     // ***********************************  (LINE 2)
            ...

        }
}

我的问题:

每当步骤2中某些业务类的构造函数发生变化时,如何避免继续更新MyContainer类的代码?我可以从上述步骤2扩展BusinessC的构造函数,但是我不想从步骤3更新MyContainer类的代码。只要在步骤2中某些业务类的构造函数发生变化,是否对MyContainer类进行一些自动编码?

谢谢您的帮助。

我正在将Autofac用于C#Windows控制台应用程序。我的控制台应用程序解决方案的项目层详细信息如下。步骤1:我创建了一个自定义Microsoft Entity Framework数据库上下文...

c# autofac
1个回答
0
投票

我自己找到了答案,并且关闭了该线程

© www.soinside.com 2019 - 2024. All rights reserved.