繁体   English   中英

Castle Windsor注册了一个界面

[英]Castle Windsor register an interface

我有一个名为'MyApp.DAL'的程序集,它包含和接口IRepository。 我还有另一个程序集“MyApp.Repository”,其中我有一些从IRepository派生的更复杂的存储库。

我还有服务层'MyApp.Service',其中一些服务引用来自'MyApp.Respository'的复杂存储库以及来自'MyApp.DAL'的简单接口IRepository。

这是界面:

public interface IRepository<T> where T : class
{
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
    T GetById(long Id);
}

这是实施:

public abstract class Repository<T> : IRepository<T> where T : class
{
    private MyContext dataContext;
    private readonly IDbSet<T> dbset;

    protected Repository(IDatabaseFactory databaseFactory)
    {
        DatabaseFactory = databaseFactory;
        dbset = DataContext.Set<T>();
    }

    protected IDatabaseFactory DatabaseFactory
    {
        get;
        private set;
    }

    protected MyContext DataContext
    {
        get { return dataContext ?? (dataContext = DatabaseFactory.Get()); }
    }

    public virtual void Add(T entity)
    {
        dbset.Add(entity);
    }

    public virtual void Update(T entity)
    {
        dbset.Attach(entity);
        dataContext.Entry(entity).State = EntityState.Modified;
    }

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


    public virtual T GetById(long id)
    {
        return dbset.Find(id);
    }
}

这是“服务”层中的服务:

public interface ICustomerService : IUpdateableService<Customer>
{
    List<Customer> GetCustomers();
}

public class CustomerService : ICustomerService
{
    private IUnitOfWork unitOfWork;
    private IRepository<Customer> customerRepository;

    public CustomerService(IUnitOfWork unitOfWork, IRepository<Customer> customerRepository)
    {
        this.unitOfWork = unitOfWork;
        this.customerRepository = customerRepository;
    }
    public List<Customer> GetCustomers()
    {
        return customerRepository.GetAll().ToList();
    }

    public CustomerGet(int id)
    {
        return customerRepository.GetById(id);
    }

    public int Save(Customer customer)
    {
        //TODO
    }

    public bool Delete(Customer customer)
    {
        //TODO
    }

我正在使用Castle Windsor注册以下类型:

        container.Register(
                    Component.For(typeof(IRepository<>))
                         .ImplementedBy(typeof(IRepository<>))
                         .LifeStyle.PerWebRequest,

                    Classes.FromAssemblyNamed("MyApp.Repository")
                        .Where(type => type.Name.EndsWith("Repository"))
                        .WithServiceAllInterfaces()
                        .LifestylePerWebRequest());

但是,当我运行应用程序时,我收到以下错误:

类型MyApp.DAL.Interfaces.IRepository1 [[MyApp.Model.Customer,MyApp.Model,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]是抽象的。 因此,无法将其实例化为服务“MyApp.DAL.Interfaces.IRepository1”的实现。 你忘了代理吗?

我怎么解决这个问题?

ImplementedBy必须是具体的类,而不是接口/抽象类。

如果要注册IRepository<>所有实现,可以编写:

container.Register(
    Classes.FromAssemblyNamed("MyApp.Repository")
            .BasedOn(typeof (IRepository<>))
            .WithService.Base()
            .LifestylePerWebRequest());

我看到Repository<T>没有抽象成员。

如果您没有Repository<T>任何派生类,那么它不应该是abstract ,IoC将能够为您创建Repository<Customer>的实例。

container.Register(
    Component.For(typeof(IRepository<>))
        .ImplementedBy(typeof(Repository<>))
        .LifestylePerWebRequest());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM