1

所以,问题是,当我宣布:统一使用相同的接口,多个工厂

[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(...); 
    } 
} 

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

+0

'AuthenticationService'与工厂有什么关系? –

+0

@YacoubMassad编辑为包含验证服务。 – Greg

+0

你想注入'AuthenticationService'的哪个'ICrudFactory'实现? –

回答

0

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

public interface IZNodeContextFactory : ICrudFactory 
{ 

} 

public interface IMincronContextFactory : ICrudFactory 
{ 

} 

通过这种方式这样做,我可以简单地做:

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

这使得自动依赖解析器的工作,并执行,因为他们现在有了唯一的名称。

1

是否要将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;} 
    } 
}