C# 依赖注入和运行时构造函数参数

C# 依赖注入和运行时构造函数参数,c#,dependency-injection,C#,Dependency Injection,我将用一个非常简单的例子来描述我的问题。假设我有一个类来处理数据库调用 public class DatabaseAccessLayer : IDatabaseAccessLayer { public DatabaseAccessLayer(string uid, string password, string server) { // build connection object and so on } } 然后我有一个类来使用它 public cl

我将用一个非常简单的例子来描述我的问题。假设我有一个类来处理数据库调用

public class DatabaseAccessLayer : IDatabaseAccessLayer
{
    public DatabaseAccessLayer(string uid, string password, string server)
    {
        // build connection object and so on
    }
}
然后我有一个类来使用它

public class MyBusinessService : IBusinessService
{
    public MyBusinessService(IDatabaseAccessLayer dal)
    {
    }
}
如果我使用
Unity
作为示例,我通常会以这种方式连接IoC容器

container.RegisterType<IDatabaseAccessLayer, DatabaseAccessLayer>(new InjectionConstructor("my_uid", "my_password", "my_server"));
container.RegisterType<IBusinessService, MyBusinessService>();
container.RegisterType(新的注入构造函数(“我的uid”、“我的密码”、“我的服务器”);
container.RegisterType();
当应用程序启动时设置IoC容器时,如果我将参数定义为已知值,则效果会很好,例如,典型的web应用程序在配置文件中具有这些值

但是,有一个要求是,我必须为每个业务服务调用将参数(uid、密码、服务器)传递给数据访问层类,因为每次调用的值可能不同。在这种情况下,我似乎无法使用IoC容器


任何人都有意见,在这种情况下我应该放弃IoC容器,还是有更好的方法使用IoC容器?

每个业务服务调用的参数值“tuples”是随机不同的,还是存在一些受约束的参数值集?如果是后者,许多容器(包括Unity)都支持命名依赖项,这在这里可能会有所帮助。将所需的参数移动到属性中,并在从IoC容器获取实例后简单地设置它们。或者将您的类型包装在具有此功能的容器中,然后配置IoC以提供此功能。有很多不同的解决办法。@MarkLarter,这是你的第一个方案。应用程序必须接受来自最终用户的值。@Will,您能进一步详细说明“或将您的类型包装到具有此功能的容器中”吗?您基本上需要一个抽象工厂。请看以下内容: