C# 默认存储库类的扩展

C# 默认存储库类的扩展,c#,.net,entity-framework,C#,.net,Entity Framework,我将存储库模式用于接口,并使用structuremap在它们之间进行映射 在my global.asax中,我定义了: ObjectFactory.Initialize(x => { x.For<IUnitOfWorkFactory>().Use<EFUnitOfWorkFactory>(); x.For(typeof(IRepository<>)).Use(typeof(EFRep

我将存储库模式用于接口,并使用structuremap在它们之间进行映射

在my global.asax中,我定义了:

    ObjectFactory.Initialize(x =>
        {
            x.For<IUnitOfWorkFactory>().Use<EFUnitOfWorkFactory>();
            x.For(typeof(IRepository<>)).Use(typeof(EFRepository<>)
        }
    );
ObjectFactory.Initialize(x=>
{
x、 For().Use();
x、 用于(typeof(eRepository))。使用(typeof(eRepository)
}
);
现在,我想向MyEntity实体添加另一个db方法。因此,我创建了MyEntityRepository:

class MyEntityRepository:EFRepository<MyEntity>, IMyEntityRepository {
    public void CloseCall(long callId) {
        ....
        ....
    }
}
class MyEntityRepository:EFRepository,IMyEntityRepository{
公共无效关闭呼叫(长呼叫){
....
....
}
}
但是现在,我不得不在structuremap的初始化中添加一行,我有很多这样的情况,structuremap初始化中的行数越来越大

此外,大多数情况下只添加了一个方法,但这一个方法的添加需要新存储库的接口、新文件中的实现以及structuremap的另一个初始化—一个方法需要大量的工作

我怎样才能解决这个问题

我做错什么了吗


也许最好使用对存储库的扩展metod(如果有对泛型的扩展…)?

如果您有必须使用特殊类型解析的特殊接口,则必须始终在某个位置编写代码来初始化此接口。如果您不想在StructureMap初始化中编写太多代码,请为DAL层使用抽象工厂模式:

工厂界面:

public interface IDalFactory
{
    IXXXRepository XXXRepository { get; }
    IYYYRepository YYYRepository { get; }
} 
实施:

public class DalFactory : IDalFactory
{
    private IXXXRepository _xxxRepository;
    public IXXXRepository XXXRepository
    {
        return _xxxRepository ?? (_xxxRepository = new XXXRepository());
    }

    private IYYYRepository _yyyRepository;
    public IYYYRepository YYYRepository
    {
        return _yyyRepository ?? (_yyyRepository = new YYYRepository());
    }
}
您将初始化您的IoC:

ObjectFactory.Initialize(x =>
        {
            x.For<IUnitOfWorkFactory>().Use<EFUnitOfWorkFactory>();
            x.For<IDalFactory>().Use<DalFactory>();
        }
    );
ObjectFactory.Initialize(x=>
{
x、 For().Use();
x、 For().Use();
}
);

专用代码总是需要在某个地方进行自己的注册,除非您构建了一些自动注册,该注册将使用反射搜索程序集,并按照某些命名约定注册存储库。

如果您有必须使用特殊类型解析的特殊接口,则必须始终在某个地方编写代码以初始化是。如果不想在StructureMap初始化中编写太多代码,请为DAL层使用抽象工厂模式:

工厂界面:

public interface IDalFactory
{
    IXXXRepository XXXRepository { get; }
    IYYYRepository YYYRepository { get; }
} 
实施:

public class DalFactory : IDalFactory
{
    private IXXXRepository _xxxRepository;
    public IXXXRepository XXXRepository
    {
        return _xxxRepository ?? (_xxxRepository = new XXXRepository());
    }

    private IYYYRepository _yyyRepository;
    public IYYYRepository YYYRepository
    {
        return _yyyRepository ?? (_yyyRepository = new YYYRepository());
    }
}
您将初始化您的IoC:

ObjectFactory.Initialize(x =>
        {
            x.For<IUnitOfWorkFactory>().Use<EFUnitOfWorkFactory>();
            x.For<IDalFactory>().Use<DalFactory>();
        }
    );
ObjectFactory.Initialize(x=>
{
x、 For().Use();
x、 For().Use();
}
);

专用代码总是需要在某个地方进行自己的注册,除非您构建一些自动注册,该注册将使用反射搜索程序集,并通过一些命名约定注册存储库。

在我的业务层中-我在其中定义了我创建的IRepository接口:

public abstract class BaseRepository<T> : IRepository<T> where T : IDataEntity
{
    protected IRepository<T> Repository { get; set; }

    public BaseRepository()
    {
        Repository = ObjectFactory.GetInstance<IRepository<T>>();
    }

    public virtual IQueryable<T> GetQuery()
    {
        return Repository.GetQuery();
    }

    public virtual IQueryable<T> GetQuery(params Expression<Func<T, object>>[] includes)
    {
        return Repository.GetQuery(includes);
    }

    public virtual void Insert(T entity)
    {
        Repository.Insert(entity);
    }

    public virtual void Update(T entity)
    {
        Repository.Update(entity);
    }

    public virtual void Delete(T entity)
    {
        Repository.Delete(entity);
    }

    public virtual void Attach(T entity)
    {
        Repository.Attach(entity);
    }
}
公共抽象类BaseRepository:IRepository,其中T:IDataEntity
{
受保护的IRepository存储库{get;set;}
公共基本存储库()
{
Repository=ObjectFactory.GetInstance();
}
公共虚拟IQueryable GetQuery()
{
返回Repository.GetQuery();
}
公共虚拟IQueryable GetQuery(参数表达式[]包含)
{
返回Repository.GetQuery(包括);
}
公共虚拟无效插入(T实体)
{
储存库。插入(实体);
}
公共虚拟无效更新(T实体)
{
更新(实体);
}
公共虚拟作废删除(T实体)
{
删除(实体);
}
公共虚拟无效附加(T实体)
{
存储库。附加(实体);
}
}
在global.asax中,我必须将IRepository映射到实体框架实现。
现在,对于我想向web公开的每个类,我必须定义:

public class MyEntityRepository: BaseRepository<MyEntity> {
    ....
    Common queries for this entity
    ....
    ....
    overrides of insert, delete and so on
}
公共类MyEntityRepository:BaseRepository{
....
此实体的常见查询
....
....
插入、删除等的覆盖
}

现在,我不能在web应用程序中使用BaseRepository,只能使用属于实体的存储库。我也不需要在structuremap中注册存储库的每个扩展。唯一的一点是,我必须记住不要直接使用eRepository(我可以使用structuremap获得它,我必须避免使用它).

在我的业务层中-我在其中定义了我创建的IRepository接口:

public abstract class BaseRepository<T> : IRepository<T> where T : IDataEntity
{
    protected IRepository<T> Repository { get; set; }

    public BaseRepository()
    {
        Repository = ObjectFactory.GetInstance<IRepository<T>>();
    }

    public virtual IQueryable<T> GetQuery()
    {
        return Repository.GetQuery();
    }

    public virtual IQueryable<T> GetQuery(params Expression<Func<T, object>>[] includes)
    {
        return Repository.GetQuery(includes);
    }

    public virtual void Insert(T entity)
    {
        Repository.Insert(entity);
    }

    public virtual void Update(T entity)
    {
        Repository.Update(entity);
    }

    public virtual void Delete(T entity)
    {
        Repository.Delete(entity);
    }

    public virtual void Attach(T entity)
    {
        Repository.Attach(entity);
    }
}
公共抽象类BaseRepository:IRepository,其中T:IDataEntity
{
受保护的IRepository存储库{get;set;}
公共基本存储库()
{
Repository=ObjectFactory.GetInstance();
}
公共虚拟IQueryable GetQuery()
{
返回Repository.GetQuery();
}
公共虚拟IQueryable GetQuery(参数表达式[]包含)
{
返回Repository.GetQuery(包括);
}
公共虚拟无效插入(T实体)
{
储存库。插入(实体);
}
公共虚拟无效更新(T实体)
{
更新(实体);
}
公共虚拟作废删除(T实体)
{
删除(实体);
}
公共虚拟无效附加(T实体)
{
存储库。附加(实体);
}
}
在global.asax中,我必须将IRepository映射到实体框架实现。
现在,对于我想向web公开的每个类,我必须定义:

public class MyEntityRepository: BaseRepository<MyEntity> {
    ....
    Common queries for this entity
    ....
    ....
    overrides of insert, delete and so on
}
公共类MyEntityRepository:BaseRepository{
....
此实体的常见查询
....
....
插入、删除等的覆盖
}

现在,我不能在web应用程序中使用BaseRepository,只能使用属于实体的存储库。我也不需要在structuremap中注册存储库的每个扩展。唯一的一点是,我必须记住不要直接使用eRepository(我可以使用structuremap获得它,我必须避免使用它).Will
x.For(typeof(IRepository)).Use(typeof(EFRepository)
compile?@Bala-R:是的,我已经用它玩过这个应用程序了。Will
x.For(typeof(IRepository)).Use(typeof(EFRepository)
compile?@B