C# MS Unity中重复的对象名称(应用程序块)

C# MS Unity中重复的对象名称(应用程序块),c#,dependency-injection,unity-container,C#,Dependency Injection,Unity Container,我会尽量让这件事简单化 对于Unity注册件: // ==================================================================== // NOTE: This fails as the WithName.TypeName is Payload for all jobs! // HOW can we make the name for payloads "[JobName].Payload"?? // ===============

我会尽量让这件事简单化

对于Unity注册件:

// ====================================================================
// NOTE:  This fails as the WithName.TypeName is Payload for all jobs!  
// HOW can we make the name for payloads "[JobName].Payload"??
// ====================================================================
_container.RegisterTypes(AllClasses.FromAssembliesInBasePath()
    .Where(type => (typeof(IJob).IsAssignableFrom(type) || typeof(IJobPayload).IsAssignableFrom(type)) && type.IsClass),
    WithMappings.FromAllInterfaces,
    WithName.TypeName,
    WithLifetime.Transient);
其中:

public interface IJob
{
    bool Execute<T>(T payload) where T : class, IJobPayload;
}
public interface IJobPayload
{
    string JobName { get; set; }
    string JobQueueName { get; set; }
    int Id { get; set; }
    JobType JobType { get; set; }
    CronExpression Cron { get; set; }
}

如何在Unity(或任何其他IoC容器)中使用它?

您正在使用的
注册表类型
重载的第三个参数的类型为
Func
RegisterTypes
方法将为找到的每个类型调用此委托,以获取注册的名称

WithName.TypeName
只是一个返回类型名称的静态方法

您可以创建自己的方法或lambda表达式,该表达式足够智能,可以检测类型是否为嵌套类型。以下是一个例子:

t => t.IsNested ? t.DeclaringType.Name + "." + t.Name : t.Name
您的注册声明如下所示:

_container.RegisterTypes(
    AllClasses.FromAssembliesInBasePath()
        .Where(type => (typeof(IJob).IsAssignableFrom(type) || typeof(IJobPayload).IsAssignableFrom(type)) && type.IsClass),
    WithMappings.FromAllInterfaces,
    t => t.IsNested ? t.DeclaringType.Name + "." + t.Name : t.Name,
    WithLifetime.Transient);

我就快到了!只是走错了路。多谢!
t => t.IsNested ? t.DeclaringType.Name + "." + t.Name : t.Name
_container.RegisterTypes(
    AllClasses.FromAssembliesInBasePath()
        .Where(type => (typeof(IJob).IsAssignableFrom(type) || typeof(IJobPayload).IsAssignableFrom(type)) && type.IsClass),
    WithMappings.FromAllInterfaces,
    t => t.IsNested ? t.DeclaringType.Name + "." + t.Name : t.Name,
    WithLifetime.Transient);