2012-03-12 80 views
5

我有一个仓库工厂NhRepositoryFactory如何注入一个工厂的泛型类型与Autofac

public interface IRepositoryFactory 
{ 
    IRepository<T> Create<T>() where T: Entity; 
} 

public class NhRepositoryFactory: IRepositoryFactory 
{ 
    public IRepository<T> Create<T>() where T : Entity 
    { 
    return new NhRepository<T>(); 
    } 
} 

为了解决一些库依赖我想从Autofac容器得到他们。所以我应该以某种方式将Func<IRepository<T>>工厂注入我的班级。我怎样才能做到这一点?
在此先感谢。

+0

为什么不将Autofac容器存储在'NhRepositoryFactory'中? – Steven 2012-03-12 08:45:32

+2

我想我的工厂是Autofac不可知的。 – 2012-03-12 08:46:42

+0

它只包含一行代码。您可以将其放置在您的组合根目录中。它不必是容器不可知的。 – Steven 2012-03-12 08:49:33

回答

5

NhRepositoryFactory不包含业务逻辑,可以是您的组合根的一部分。这允许你让它有一个对容器的引用。 This is just mechanics并且不被视为服务定位器反模式。该NhRepositoryFactory看起来就像这样:

// This class is part of your composition root 
public class NhRepositoryFactory : IRepositoryFactory 
{ 
    private readonly Container container; 

    public NhRepositoryFactory(Container container) 
    { 
     this.container = container; 
    } 

    public IRepository<T> Create<T>() where T : Entity 
    { 
     return this.container.Resolve<NhRepository<T>>(); 
    } 
} 

你可以这样注册它:

+0

我同意以这种或那种方式与Autofac结合似乎是不可避免的。我按照你的建议来完成它。不同的是,我通过'ILifetimeScope'而不是'Container'。 – 2012-03-12 14:00:34

+0

我改变了实现。我用'T Create ()'创建了'IObjectFactory'接口,该方法使用ILifetimeScope来创建对象。它由注入'NhRepositoryFactory'的'AutofacObjectFactory'类实现。所以现在没有Autofac耦合。 – 2012-03-13 04:56:20

+0

重构后'IRepositoryFactory'已被删除。它的地方采取了'IObjectFactory'。 – 2012-03-13 05:09:08

4

Autofac也能在本地处理一般不设立工厂。

builder.RegisterGeneric(typeof(NhRepository<>)) 
    .As(typeof(IRepository<>)) 
    .InstancePerLifetimeScope(); 

使用此模式,您可以简单地依赖IRepository,autofac将填充依赖项。

+1

我试过这种方式。但是当某个类需要多个存储库时,我不得不将它们添加为构造函数参数。他们每个人的领域也将被创造。这看起来很笨拙,所以我创建了一家工厂。 – 2012-03-13 03:12:48