更多地控制泛型类型的实例化?

时间:2010-04-28 17:23:02

标签: c# structuremap

我正在尝试使用StructureMap注册一些实现通用接口的类型,并通过工厂进行实例化。

我的代码:

    public interface IManagerBase<T, TKey> : IDisposable
    {
        // Get Methods
        T GetById(TKey Id);
    }

    public partial interface IServerHostManager : IManagerBase<ServerHost, int>
    {
        // ServerHost Specific Get Methods
    }    

    partial class ServerHostManager : ManagerBase<ServerHost, int>, IServerHostManager
    {
        // Implementation
    }

    public class ManagerFactory : IManagerFactory
    {
        public IServerHostManager GetServerHostManager()
        {
            return new ServerHostManager();
        }
    }

这很好用:

 For<IServerHostManager>().HybridHttpOrThreadLocalScoped()
.Use(new ManagerFactory().GetServerHostManager());

调用我的工厂并返回一个新的IServerHostManager实例。

有什么方法可以扫描所有泛型类型并通过我的工厂实例化它们?

由于ServerHostManager是一个内部类,这不起作用:

        Scan(x =>
        {
            x.AssemblyContainingType(typeof(IManagerBase<,>));
            x.AddAllTypesOf(typeof(IManagerBase<,>));
            x.ConnectImplementationsToTypesClosing(typeof(IManagerBase<,>))
                .OnAddedPluginTypes(t => t.HybridHttpOrThreadLocalScoped());
        });

我可以用什么扫描命令告诉SM打电话给我的工厂?

谢谢,

瑞克

在5/4上添加了跟进:

很抱歉延迟跟进。

我有一堆CodeSmith的nHibernate模板创建的管理器对象(> 75)。它们通常通过工厂对象访问。相反,我想扫描它们,让它们全部自动注册。

这就是我现在注册对象的方式:

For<IActivityLogManager>().HybridHttpOrThreadLocalScoped() 
.Use(new ManagerFactory().GetActivityLogManager()); 

For<IAspnetUserManager>().HybridHttpOrThreadLocalScoped() 
.Use(new ManagerFactory().GetAspnetUserManager()); 

以下是对象

public interface IManagerBase<T, TKey> : IDisposable
{
    // Get Methods 
    T GetById(TKey Id);
}

public partial interface IActivityLogManager : IManagerBase<BusinessObjects.ActivityLog, int>
{
    // Get Methods
    IList<ActivityLog> GetByActivityTypeId(System.Int32 activityType);
}

public partial class ActivityLogManager : ManagerBase<BusinessObjects.ActivityLog, int>, IActivityLogManager
{
    public IList<ActivityLog> GetByActivityTypeId(System.Int32 activityType)
    {
        // Code to fetch objects
    }    
}

public partial interface IAspnetUserManager : IManagerBase<BusinessObjects.AspnetUser, System.Guid>
{
    // Get Methods
    IList<ActivityLog> GetByActivityTypeId(System.Int32 activityType);
}

public partial class AspnetUserManager : ManagerBase<BusinessObjects.AspnetUser, System.Guid>, IAspnetUserManager
{
    public IList<AspnetUser> GetAll()
    {
        // Code to fetch objects
    }    
}

我的扫描码:

Scan(x => 
    { 
        x.AssemblyContainingType(typeof(IManagerBase<,>)); 
        x.AddAllTypesOf(typeof(IManagerBase<,>)); 
        x.ConnectImplementationsToTypesClosing(typeof(IManagerBase<,>)) 
            .OnAddedPluginTypes(t => t.HybridHttpOrThreadLocalScoped());     
    });

上面的扫描代码在程序集中找不到任何对象。

我希望这能澄清我的情况。

谢谢,

瑞克

1 个答案:

答案 0 :(得分:1)

这个问题可以通过使程序集成为朋友来解决:

[assembly: InternalsVisibleTo("AssemblyB")]

http://msdn.microsoft.com/en-us/library/0tke9fxk.aspx