我正在将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数据库上下文...
我自己找到了答案,并且关闭了该线程