簡體   English   中英

在溫莎中注冊組件時需要澄清

[英]Clarification needed on registering components in Windsor

根據文檔,我試圖注冊我的所有IRepository實現,以進一步注入到像這樣的控制器中:

        container.Register(
            Classes.FromThisAssembly()
                .BasedOn<IRepository>()
                .WithService.Base()
                .LifestyleTransient());

具體存儲庫實例的用法很簡單:

public class TheController : Controller
{
    private MyConcreteRepository repo;


    public TheController (MyConcreteRepository r)
    {
        repo = r;
    }


    public ActionResult Index()
    {
        var ans = repo.GiveMeData<TheDataType>();
        ...
        ...
        return View();
    }
}

並啟動它引發的應用程序

'MyMVCWebSite.Controllers.TheController' is waiting for the following dependencies:
- Service 'MyMVCWebSite.DataUtils.MyConcreteRepository' which was not registered.

存儲庫層次結構看起來像

public interface IRepository : IDisposable
{
    ...
}


public interface IAlmostConcreteRepository : IRepository
{
    DbSet<TEntity> GiveMeData<TEntity>() where TEntity : class;
}


public class MyConcreteRepository : IAlmostConcreteRepository 
{
    protected DbContext context;

    public MyConcreteRepository(DbContext dbc)
    {
        context = dbc;
    }

    public DbSet<TEntity> GiveMeData<TEntity>() where TEntity : class 
    {
        return context.Set<TEntity>();
    }

    ...

    public void Dispose()
    {
        ...
    }
}

因此,都不是一對一地注冊組件

        container.Register(
            Component.For<IAlmostConcreteRepository>()
            .ImplementedBy<MyConcreteRepository>()
            .LifestyleTransient());

也不能按照帖子開頭提到的慣例進行操作。 只能注冊具體實例:

        container.Register(
            Component.For<MyConcreteRepository>()
            .LifestyleTransient());

要么

        container.Register(
            Classes.FromThisAssembly()
                .BasedOn(typeof(MyConcreteRepository))
                .WithService.Base()
                .LifestyleTransient());

我是否錯過了文檔中的某些內容? 請幫忙。

在這里,我使用MyConcreteRepository類代替了接口,所以就是問題所在。

public class TheController : Controller
{
    private MyConcreteRepository repo;


    public TheController (MyConcreteRepository r)
    {
        repo = r;
    }
}

簡單拼寫錯誤,應為:

public class TheController : Controller
{
    private IAlmostConcreteRepository repo;


    public TheController (IAlmostConcreteRepository r)
    {
        repo = r;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM