目前,我的代码与此类似(缩短只是为了说明一点):

DAL

存储库接口

public interface IRepository<TEntity, in TKey>
{
    IList<TEntity> GetAll();
    TEntity Get(TKey id);
    TEntity Add(TEntity item);
    TEntity Update(TEntity item);
    bool Remove(TKey id);
}

基本EF存储库

public class BaseEFRepository<TEntity, TKey> : IRepository<TEntity, TKey> where TEntity: class, IEntity<TKey> where TKey: struct
{
    protected readonly DbContext _dbContext;

    public BaseRepository()
    {
        _dbContext = new MyDB();
        _dbContext.Configuration.ProxyCreationEnabled = false;
        _dbContext.Configuration.LazyLoadingEnabled = false;
    }

    public virtual TEntity Get(TKey id)
    {
        return _dbContext.Set<TEntity>().Find(id);
    }

    public virtual IList<TEntity> GetAll()
    {
        return _dbContext.Set<TEntity>()
            .ToList();
    }

    public virtual TEntity Add(TEntity item)
    {
        _dbContext.Set<TEntity>().Add(item);
        _dbContext.SaveChanges();
        return item;
    }
    .....
    .....
}

基本存储库的示例实现

public interface IContactsRepository : IRepository<Contact, long>
{
    Contact GetByEmployeeId(string empId, ContactType type);
    IList<Contact> GetByEmployeeId(string empId);
}

public class ContactsRepository : BaseEFRepository<Contact, long>, IContactsRepository
{
    public Contact GetByEmployeeId(string empId, ContactType type)
    {
        var contact = _dbContext.Set<Contact>()
            .FirstOrDefault(d => d.EmployeeId == empId && d.ContactType == type);

        return contact;
    }

    public IList<Contact> GetByEmployeeId(string empId)
    {
        var contacts = _dbContext.Set<Contact>()
            .Where(d => d.EmployeeId == empId)
            .ToList();

        return contacts;
    }
}

BLL

public class Contacts
{
    public Contact Get(long id)
    {
        IContactsRepository repo = ResolveRepository<IContactsRepository>();
        var contact = repo.Get(id);
        return contact;
    }

    public Contact GetByEmployeeId(string empId, ContactType type)
    {
        IContactsRepository repo = ResolveRepository<IContactsRepository>();         
        return repo.GetByEmployeeId(empId, type);
    }
    .......
    .......
}

现在,一切都很好。 我可以简单地做这样的事情:

 var _contacts = new Contacts();
 var contact = _contacts.GetByEmployeeId("C1112", ContactType.Emergency);

当我阅读这篇博文时,混乱开始,作者说使用如下代码:

IContactsRepository repo = ResolveRepository<IContactsRepository>();  

是一种糟糕的技术,它是反模式,应该在代码的根源注入所有内容。 我无法看到如何使用存储库模式执行此操作。 我正在使用WCF消费它。 那么,我将如何从WCF的第一次调用中注入所有内容? 我无法得到它。 我在这里错过了什么?

最后一点,在这种情况下,WCF是最后一层,它应该只知道它之前的层,即BLL层。 如果我要按照该博客的作者建议实现任何内容,我会让WCF层知道DAL层,这不是那么糟糕的做法吗? 如果我错了,请纠正我。

===============>>#1 票数:3

您需要使用构造函数注入,然后在组合根中组合您的对象。

当您使用构造函数注入时,您通过构造函数注入依赖项,因此您的类看起来像这样:

public class BaseRepository
{
    protected readonly DbContext _dbContext;

    //...
    public BaseRepository(DbContext context)
    {
        _dbContext = context;
    }
    //...
}

public class ContactsRepository : BaseEFRepository<Contact, long>, IContactsRepository
{
    //...
    public ContactsRepository(DbContext context)
        :base(context)
    {

    }
    //...
}

public class Contacts
{
    private readonly IContactsRepository m_ContactsRepository;

    public Contacts(IContactsRepository contacts_repository)
    {
        m_ContactsRepository = contacts_repository;
    }

    public Contact Get(long id)
    {
        var contact = m_ContactsRepository.Get(id);
        return contact;
    }
    //...
}

然后在Composition Root中,您将把所有对象组合在一起。 可选择通过DI容器。

以下是使用Pure DI的此类组合的示例:

var context = new MyDB();

context.Configuration.ProxyCreationEnabled = false;

context.Configuration.LazyLoadingEnabled = false;

var contacts = new Contacts(new ContactsRepository(context));

在IIS中承载的WCF应用程序中,组合根是自定义的ServiceHostFactory 这个答案提供了有关如何做到这一点的更多细节。

===============>>#2 票数:2

您需要确定适合用作合成根的接缝。

对于WCF,您需要具有创造性 - 您必须创建一个自定义ServiceHostFactory来拦截组成对象根目录的正确位置。

参见本文和Mark Seemann的这篇文章 (“.Net中的依赖注入”一书的作者 - 我认为你会发现这本书非常有用)。

许多免费的DI容器, 如Autofac ,为WCF提供了现成的支持,这可能是最好的方法。

我真的不能足够推荐Seemann的书 - 它详细介绍了这一点。

您可能还会发现有关使用Autofac DI和ASP.Net以及存储库有趣的文章。

===============>>#3 票数:2

@Matthew的帖子应该回答你的问题。 但是,我想提一下我在代码中注意到的与问题相关的一件事。 您不应该尝试手动解决依赖关系,但应该由容器注入。 我已修改您的代码以显示此行为:

public class Contacts
{
    private IContactsRepository repo;
    public Contacts(IContactsRepository injectedContactsRepository)
    {
        repo = injectedContactsRepository;
    }


    public Contact Get(long id)
    {
        var contact = repo.Get(id);
        return contact;
    }

//and other methods definitions...
}

  ask by Nean Der Thal translate from so

未解决问题?本站智能推荐:

1回复

如何使用SimpleIOC注册通用存储库

如何在SimpleIOC中注册通用存储库? 我也尝试过:
4回复

如何正确使用Unity将ConnectionString传递给我的存储库类?

我刚刚开始使用微软的Unity应用程序块依赖注入库,而且我已经失败了。 这是我的IoC类,它将处理我的具体类到它们的接口类型的实例化(所以每次我想在我的控制器中存储库时,我不必在IoC容器上保持名为Resolve): 所以,我的想法是,从我的控制器,我可以做到以下几点: 我
4回复

工作单元模式的泛型问题

我需要帮助设计工作单元+存储库+ IoC模式。 我有几个接口定义如下: 我使用Unity来解决一些引用。 这是UoW的实现: 现在我无法调用界面: 类型'IUserRepository'不能在泛型类型或方法'IUnitOfWork.Respository()'中用
1回复

设计模式:使用IoC设置控制器,服务,存储库和UnitOfWork

想象一下,我有一个汽车租赁店的服务。 我让CarsController在其唯一的构造函数中接受ICarService,CarService在其唯一的构造函数中接受IUnitOfWork。 IUnitOfWork为ICarsRepository,IUsersRepository和ILogs
2回复

继承服务类中的存储库还是其他问题?

考虑此依赖项注入设置。 我的bookingRepository是驻留在数据访问层中的实现,而bookingService是一个bookingService的。 驻留在业务层中。 我使用BookingRepository保存预订,并且我希望预订冲突逻辑在业务层中,因此我有一个预订服
3回复

IOC / DI有2个实现相同接口的类

我对实现相同接口和依赖注入的2个类的场景感到困惑。 我已经看到在线示例说这是有效的,但你一次只能使用一个类。 因此,如果应用程序在SiteA运行,您告诉您的IOC使用SomethingA,但如果它在SiteB,您告诉它使用SomethingAB。 因此,有一个应用程序有2个类实现
1回复

与使用DI容器相比,使用new运算符创建对象/依赖关系

通过构造函数注入手动连接依赖项有什么不好的地方,而使用DI容器( container.Resolve<T>() )有什么不好的地方呢? 我的意思是,除了事实之外,每次需要创建依赖对象并将其提供所有依赖项时,您都必须键入一些按键。 实际上,拥有像DI容器这样的中央注册表可以
1回复

DI组合根:如何确保编译时分辨率检查

我已经阅读了Mark Seeman关于依赖注入的几篇文章,特别是避免使用Service Locator模式的原因: 服务定位器是反模式 服务定位器违反封装 服务定位器违反SOLID Service Locator出现问题的基本思想是它可能在运行时失败:
2回复

具有依赖注入的基本控制器的设计模式 - MVC 3 + Ninject

我有这种模式 所以我能够做这样的事情 在我的所有控制器中。 我确信这是DI和IoC的反模式,所以我简化了这样的解决方案 但是这个解决方案要求我在所有控制器中插入所有依赖项并更新所有构造函数,如果我需要一个新的全局变量(如rep)或一个新的私有变量用于basecontro
2回复

具有泛型和DI的存储库模式

我有一个基本存储库合同,其他合同对此进行了扩展,如下所示 然后还有其他合同将其扩展如下 我实现IRepository1如下 对于IRepository2同样 现在我有一个服务Service1,其实现如下所示的IService 我想在我的服务构造函数中使用我