【问题标题】:Unity with the same interface, multiple factoriesUnity 同一个界面,多个工厂
【发布时间】:2016-04-27 00:17:41
【问题描述】:

所以问题是,当我声明时:

[Dependency]
public AuthenticationService _authenticationServices { get; set; }

_authenticationServices 将始终保持为null。它没有被引用,这将引发空引用异常。我假设问题源于我的 Unity 配置文件:

container.RegisterType<ICrudFactory, ZNodeDataContextFactory>();
container.RegisterType<ICrudFactory, MincronDataContextFactory>();

因为它们都使用相同的接口,但有一个单独的具体实现。实现如下:

public interface ICrud : IDisposable
{
     // Method's to be exposed, via general repository.
}

public interface ICrudFactory
{
     ICrud Create();
}

public ZNodeDataContext : DbContext, ICrud
{
     // Concrete implementation.
}

public MincronDataContext : DbContext, ICrud
{
     // Concrete implementation.
}

public ZNodeDataContextFactory : ICrudFactory
{
     ICrud ICrudFactory.Create()
     {
           return ZNodeDataContext();
     }
}

public MincronDataContextFactory : ICrudFactory
{
     ICrud ICrudFactory.Create()
     {
           return MincronDataContext();
     }
}

public class AuthenticationService
{
     private readonly ICrudFactory _factory;
     public AuthenticationService(ICrudFactory factory)
     {
         _factory = factory;
     }

     public void Sample()
     {
          using(var context = _factory.Create())
              context.Method(...);
     }
}

我想保持这种结构,以避免代码重复。

【问题讨论】:

  • AuthenticationService与工厂有什么关系?
  • @YacoubMassad 已编辑以包含身份验证服务。
  • 你要将ICrudFactory的哪个实现注入AuthenticationService
  • 好吧,我想做 ZNodeDataContext 但如果我需要另一个,请访问它。
  • 为其添加默认注册,如下所示:container.RegisterType&lt;ICrudFactory, ZNodeDataContextFactory&gt;();

标签: c# asp.net dependency-injection unity-container ioc-container


【解决方案1】:

我最终解决了这个问题,为每个通用存储库创建了特定的容器。

public interface IZNodeContextFactory : ICrudFactory
{

}

public interface IMincronContextFactory : ICrudFactory
{

}

通过这种方式,我能够简单地做到:

container.RegisterType<IZNodeContextFactory, ZNodeContextFactory>();
container.RegisterType<IMincronContextFactory, MincronContextFactory>();

这允许自动依赖解析器工作和实施,因为它们现在具有唯一的名称。

【讨论】:

    【解决方案2】:

    您想将ZNodeDataContextFactory 注入AuthenticationService 吗?注入的一点是,服务现在不应该与实现有关。但是如果你真的想要一个特定的实现,你可以创建一个命名实例。

    public class AuthenticationService
    {
         private readonly ICrudFactory _factory;
         public AuthenticationService([Dependency("ZNodeData")] ICrudFactory factory)
         {
             _factory = factory;
         }
    }
    

    在你的配置中:

    container.RegisterType<ICrudFactory, ZNodeDataContextFactory>("ZNodeData");
    container.RegisterType<ICrudFactory, MincronDataContextFactory>("MincronData");
    

    或者:

        public class AuthenticationService
        {
             private readonly IEnumerable<ICrudFactory> _factories;
             public AuthenticationService(ICrudFactory[] factories)
             {
                 // Now you got both...
                 _factories = factories;
                 var zNodeFactory = _factories.FirstOrDefault(x => x.Factory == ZNode);
             }
        }
    
    
        public interface ICrudFactory
        {
             ICrud Create();
             // Something to identify the type of data. Maybe an enum?
             FactoryType Factory {get;}
        }
    
    public ZNodeDataContextFactory : ICrudFactory
    {
         ICrud ICrudFactory.Create()
         {
               return ZNodeDataContext();
         }
    
         FactoryType ICrudFactory.Factory
         {
            {get {return FactoryType.ZNode;}
         }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      相关资源
      最近更新 更多