Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用依赖项注入正确管理这种情况_C#_Dependency Injection_Castle Windsor - Fatal编程技术网

C# 如何使用依赖项注入正确管理这种情况

C# 如何使用依赖项注入正确管理这种情况,c#,dependency-injection,castle-windsor,C#,Dependency Injection,Castle Windsor,想象一下,你有一个网站,每个用户都可以把一个代码放在一个框中,然后按“搜索”来查找有关产品的信息。代码将与模式匹配:SHOPNAME-PROGRESSIVENUMBER,例如:EVERYDAYSHOES-002,或NEWGAMES-005 当用户按下“搜索”按钮时,我的代码将: 识别商店 获取连接到DB的连接字符串,这对于每个商店都是不同的 使用该连接字符串在该数据库上调用查询 我想到的第一件事就是编写如下代码: public interface IProductInformationsProv

想象一下,你有一个网站,每个用户都可以把一个代码放在一个框中,然后按“搜索”来查找有关产品的信息。代码将与模式匹配:
SHOPNAME-PROGRESSIVENUMBER
,例如:
EVERYDAYSHOES-002
,或
NEWGAMES-005

当用户按下“搜索”按钮时,我的代码将:

  • 识别商店
  • 获取连接到DB的连接字符串,这对于每个商店都是不同的
  • 使用该连接字符串在该数据库上调用查询
  • 我想到的第一件事就是编写如下代码:

    public interface IProductInformationsProvider
    {
        string GetProductName(int productCode);
    }
    
    public class SQLProductInformationsProvider : IProductInformationsProvider
    {
        ... 
    
        public SQLProductInformationsProvider(
            string connectionString,
            ILogService logService)
        {
            ...
        }
    
        public string GetProductName(int productCode)
        {
            ...
        }
    }
    
    要获得
    IPProductInformationsProvider
    的距离,我将使用DI容器并执行以下操作:

    public interface IProductInformationsProvider
    {
        string GetProductName(int productCode);
    }
    
    public class SQLProductInformationsProvider : IProductInformationsProvider
    {
        ... 
    
        public SQLProductInformationsProvider(
            string connectionString,
            ILogService logService)
        {
            ...
        }
    
        public string GetProductName(int productCode)
        {
            ...
        }
    }
    

    public void SearchButtonHandler(字典商店连接字符串映射)
    {
    使用(var container=new WindsorContainer())
    {
    集装箱。登记(
    用于()的组件
    .ImplementedBy());
    集装箱。登记(
    用于()的组件
    .由()实施
    德彭森先生(
    OnValue(“connectionString”,shopsConnectionStringsMap[parsedShopName]);
    var productInformationsProvider=container.Resolve();
    var productName=productInformationsProvider.GetProductName(代码);
    //使用productName执行某些操作
    }
    }
    
    我的问题是:

  • 每次点击我的按钮都进行注册解析是好还是坏(以及为什么)
  • 如果它不好,我如何重构它,使其与DI模式相关
  • 关于第二个问题,我的想法是:

  • 只要在每次单击按钮时调用Resolve overriding
    connectionString

  • 解析所有可能的
    SQLProductInformationsProvider
    ,将它们缓存在字典中并使用所需的字典

  • 从构造函数中删除
    connectionString
    ,并将其放在方法
    SetConnectionString(stringconnectionstring)
    上,但在这种情况下,我必须更加担心线程安全


  • 所有这三个想法都不能让我满意,它们让我觉得我误解了什么。我缺少什么/我怎样才能改变我的观点?

    我认为一个解决方案是:

    public interface IProductInformationsProvider
    {
        string GetProductName(int productCode);
    }
    
    public interface IConnectionStringProvider
    {
        string GetConnectionString(string shopName);
    }
    
    public class SQLProductInformationsProvider : IProductInformationsProvider
    {
        ... 
    
        public SQLProductInformationsProvider(
            IConnectionStringProvider connectionStringProvider,
            ILogService logService)
        {
            ...
        }
    
        public string GetProductName(string shopName, int productCode)
        {
            string connectionString = connectionStringProvider.GetConnectionString(shopName);
            ...
        }
    }
    
    public void SearchButtonHandler(string shopName, int Code)
    {
        // _productInformationsProvider already resolved
        var productName = _productInformationsProvider.GetProductName(shopName, Code);
        // Do something with productName
    }
    

    使用容器先注册具体类型,然后在下一行中解析是没有意义的。容器在这里引入了什么值,而不是在这两种类型上调用
    new
    ?您如何通过构造函数传递
    \u shopsConnectionStringsMap
    ?您现在可以展示构造函数的外观吗?