【问题标题】:c# DI Unity Container how to resolve dependent objectc# DI Unity Container如何解析依赖对象
【发布时间】:2014-02-22 16:50:21
【问题描述】:

我们有以下 IProduct 和 ILogger 类的实现。经理类被用作沟通渠道。我们已经使用下面给出的统一来解决管理器类,但它给出了以下错误-

===================unity configuration==========

IUnityContainer container = new UnityContainer();
container.RegisterType<ILogger, FileLogger>("File");
container.RegisterType<ILogger, BDLogger>("DB");

container.RegisterType<IProduct, ProductA>("productA");
container.RegisterType<IProduct, ProductB>("productB");

container.RegisterType<ProducManager>(new InjectionConstructor(container.Resolve<IProduct>("productA")));

container.Resolve<ProducManager>("productA");

========================================================

"解析依赖失败,type = \"usingDI.IProduct\", name = \"productA\"。\r\n出现异常 while: while 正在解决。\r\n异常是: InvalidOperationException - 当前 类型,使用DI.ILogger,是一个接口,不能被构造。是 你错过了一个类型 映射?\r\n-------------------------------------------- ---\r\n在 异常发生的时间,容器是:\r\n\r\n Resolving usingDI.ProductA,productA (映射自 usingDI.IProduct, productA)\r\n 解析构造函数的参数“logger” usingDI.ProductA(usingDI.ILogger 记录器)\r\n 正在解决 使用 DI.ILogger,(none)\r\n"}"

请建议我解决管理器类依赖关系的最佳方法。

public interface IProduct
{
    void dosomething();
}

public class ProducManager
{
    IProduct _product;
    public ProducManager(IProduct product)
    {
        _product = product;
    }

    public void DoSomething()
    {
        _product.dosomething();
    }
}

public class ProductA : IProduct
{
    ILogger _logger;
    public ProductA(ILogger logger)
    {
        _logger = logger;
    }

    public void dosomething()
    {

        try
        {
            //code
            //
        }
        catch (Exception ex)
        {
            _logger.WriteLog(ex.Message);
        }
    }
}

public class ProductB : IProduct
{
    ILogger _logger;
    public ProductB(ILogger logger)
    {
        _logger = logger;
    }

    public void dosomething()
    {

        try
        {
            //code
            //
        }
        catch (Exception ex)
        {
            _logger.WriteLog(ex.Message);
        }
    }
}
public class LogManager
{
    ILogger _logger;
    public LogManager(ILogger logger)
    {
        _logger = logger;
    }

    public void WriteLog(string exception)
    {
        _logger.WriteLog(exception);
    }
}

public interface ILogger
{
    void WriteLog(string exception);
}

public class FileLogger : ILogger
{

    public void WriteLog(string exception)
    {

    }
}

public class BDLogger : ILogger
{

    public void WriteLog(string exception)
    {

    }
}

【问题讨论】:

  • 添加了统一配置。

标签: c# dependency-injection unity-container


【解决方案1】:

你需要为你的接口ILogger注册一个类型映射。否则 Unity 现在不应该使用 ILogger 的哪个实现(请参阅您的例外)。

这是一个注册接口 ILogger 并映射到 FileLogger 的示例:

_container.RegisterType<ILogger, FileLogger>();

IProduct product = _container.Resolve<ProductA>(); //ILogger is injected to Product

【讨论】:

  • 谢谢杰霍夫。 IProduct 有不同的产品实现,在特定的产品类中,我们需要使用一些其他类对象,如 FileLogger,它们是从具有不同实现的某些接口派生的。当我们为 ProductA 解析 ProductManager 类时,想要解析 FileLogger 和 ProductB DBLogger。请提出建议。
  • 然后你需要为 ProductA 做一个类似的注册,它有一个 InjectionConstructor(container.Resolve("File")) 和 ProductB。
  • 谢谢泰勒,你是对的。但最后我决定对 ProductA、ProductB 使用 CI 而不是注册管理器类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 2015-01-14
  • 2014-04-05
  • 2016-12-30
相关资源
最近更新 更多