簡體   English   中英

溫莎城堡僅在實現不是抽象或接口的情況下注冊服務和實現

[英]castle windsor registering service and implementation only where implementation is not abstract or interface

我在域中的所有服務及其接口都在一個項目中,而在另一個項目中。 我使用以下代碼注冊程序集:

public IWindsorContainer SetupWithWebRequest()
{
    return Generate(c => c.LifestylePerWebRequest());
}

public WindsorContainer SetupWithThread()
{
    return Generate(c => c.LifestylePerThread());
}

private WindsorContainer Generate(Action<ComponentRegistration> reg)
{
    var container = new WindsorContainer();

    var types = new List<FromAssemblyDescriptor>();
    types.Add(Types.FromAssembly(typeof(BlogRepository).Assembly));
    types.Add(Types.FromAssembly(typeof(BlogEntryService).Assembly));

    foreach (var type in types)
    {
        container.Register(type.Pick().WithServiceAllInterfaces().Configure(reg));
    }

    //ensure the db context is passed in.
    container.Register(Component.For<IUserRepository<BlogUserEntity, int>>().LifeStyle.PerWebRequest.UsingFactoryMethod(() => new GenericUserRepository<BlogUserEntity, int>(new BlogEngineContext())));

   return container;
}

上面的代碼將注冊許多我不感興趣的東西。 例如,所有IDisposable。 這可能不是問題,難道不知道這是否會減慢速度嗎? 我的主要問題是我在域層中定義了一個接口,但在網站中實現了該接口。

上面的代碼在域DLL中,並從網站(global.asax)調用,如下所示:

 var container = new WindsorContainerGeneration().SetupWithWebRequest();
 container.RegisterControllers(Assembly.GetExecutingAssembly());

 //setup the website to get its user from aspnet.
 container.Register(Component.For<IGetCurrentUserName>().LifeStyle.PerWebRequest.ImplementedBy(typeof(GetCurrentUserNameUsingAspnet)));

 GlobalConfiguration.Configuration.DependencyResolver = new WindsorDependencyResolver(container);
 ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(container));

即使我手動注冊了IGetCurrentUserName實例,該容器也已經注冊了一個實例,其中服務和實現都是接口。

有沒有辦法確保只有實現接口的類才被注冊而不是在上面?

您可以使用types.BasedOn<IInterfaceName>()篩選僅實現特定接口的類。

如果只想過濾實現任何接口的類,則可以使用以下方法:

types.Where(type => type.GetInterfaces().Any() 

這是一個示例實現:

protected virtual IEnumerable<IRegistration> GetComponentRegistrations()
        {
            return new IRegistration[]
                {
                    Classes.FromAssembly(GetAssemblyNamed(MyAssembly))
                           .BasedOn<IMyComponent>()
                           .If(x => x.IsContructable()) // this is it
                           .WithServiceDefaultInterfaces()
                };
        }

public static class TypeHelpers
    {
        public static bool IsContructable(this Type t)
        {
            return !t.IsAbstract && !t.ContainsGenericParameters;
        }
    }

暫無
暫無

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

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