1

Так что вопрос, когда я заявляю:Unity с таким же интерфейсом, несколько заводов

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

_authenticationServices будет постоянно оставаться null. На него не ссылаются, что приведет к выводу Null Reference Exception. Я предполагаю, что проблема вытекает из моего файла конфигурации 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

Как работает «Аутентификация», связанная с заводами? –

+0

@YacoubMassad Отредактировано для включения службы аутентификации. – Greg

+0

Какую реализацию 'ICrudFactory' вы хотите ввести в' AuthenticationService'? –

ответ

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;} 
    } 
} 
Смежные вопросы