C# 是否可以使用Activator.CreateInstance()创建具有参数的构造函数的通用工厂?

C# 是否可以使用Activator.CreateInstance()创建具有参数的构造函数的通用工厂?,c#,generics,factory-pattern,C#,Generics,Factory Pattern,当它返回的类需要构造函数中的参数时,有没有办法实现泛型工厂?我所有的工厂都是这样的: public static class UserServiceFactory { public static UserService GetService() { UserRepository userRepository = new UserRepository(); return new UserService(userRepository); }

当它返回的类需要构造函数中的参数时,有没有办法实现泛型工厂?我所有的工厂都是这样的:

public static class UserServiceFactory
{
    public static UserService GetService()
    {
        UserRepository userRepository = new UserRepository();
        return new UserService(userRepository);
    }

}
 public static TServiceClass GetService<TServiceClass>()
        where TServiceClass : class, new()
    {
        TServiceClass serviceClass = null;

        string repositoryName = typeof (TServiceClass).ToString().Replace("Service", "Repository");
        Type type = Type.GetType(repositoryName);

        if (type != null)
        {
            object repository = Activator.CreateInstance(type);
            serviceClass =  (TServiceClass)Activator.CreateInstance(typeof (TServiceClass), new[]{repository});
        }

        return serviceClass;
    }
我试过这样的方法:

public static class UserServiceFactory
{
    public static UserService GetService()
    {
        UserRepository userRepository = new UserRepository();
        return new UserService(userRepository);
    }

}
 public static TServiceClass GetService<TServiceClass>()
        where TServiceClass : class, new()
    {
        TServiceClass serviceClass = null;

        string repositoryName = typeof (TServiceClass).ToString().Replace("Service", "Repository");
        Type type = Type.GetType(repositoryName);

        if (type != null)
        {
            object repository = Activator.CreateInstance(type);
            serviceClass =  (TServiceClass)Activator.CreateInstance(typeof (TServiceClass), new[]{repository});
        }

        return serviceClass;
    }
publicstatictserviceclass GetService()
其中TServiceClass:class,new()
{
TServiceClass serviceClass=null;
字符串repositoryName=typeof(TServiceClass).ToString().Replace(“服务”、“存储库”);
Type Type=Type.GetType(repositoryName);
if(type!=null)
{
对象存储库=Activator.CreateInstance(类型);
serviceClass=(TServiceClass)Activator.CreateInstance(typeof(TServiceClass),新[]{repository});
}
返回服务类;
}
然而,这当然行不通,因为我不能使用一个没有无参数构造函数的类作为泛型参数,但我觉得我已经接近了。我考虑像
GetService(Type serviceclastype)
那样传递服务类,但是我不能声明方法的返回类型,并且在调用它时必须强制转换它,这是我想要避免的


还有别的办法吗?这可能吗?

您可以这样做,并将这两种类型都作为类型参数:

public static TService GetService<TRepository, TService>() where TRepository:new()
{
    var repository = new TRepository();
    return (TService)Activator.CreateInstance(typeof(TService), repository);
}
publicstatictservice GetService(),其中TRepository:new()
{
var repository=new TRepository();
return(TService)Activator.CreateInstance(typeof(TService),repository);
}
或者,如果您希望依赖服务和存储库名称相同的约定(仅用于说明):

publicstatictservice GetService()
{
var repositoryName=String.Concat(typeof(TService).Namespace,Type.Delimiter,typeof(TService).Name.Replace(“服务”,“存储库”);
对象存储库=Activator.CreateInstance(Type.GetType(repositoryName));
return(TService)Activator.CreateInstance(typeof(TService),repository);
}
这感觉不明显,也不直观,也许有更好、更健壮的解决方案可用

也许使用一种更合适的方法


使用容器,我只需解析
UserService
,并让容器注入适当的存储库。如果
UserService
是来自其他内容的依赖项,则让DI容器解决该问题,现代容器将解决依赖项的依赖项。

您可以这样做,并将这两种类型都作为类型参数:

public static TService GetService<TRepository, TService>() where TRepository:new()
{
    var repository = new TRepository();
    return (TService)Activator.CreateInstance(typeof(TService), repository);
}
publicstatictservice GetService(),其中TRepository:new()
{
var repository=new TRepository();
return(TService)Activator.CreateInstance(typeof(TService),repository);
}
或者,如果您希望依赖服务和存储库名称相同的约定(仅用于说明):

publicstatictservice GetService()
{
var repositoryName=String.Concat(typeof(TService).Namespace,Type.Delimiter,typeof(TService).Name.Replace(“服务”,“存储库”);
对象存储库=Activator.CreateInstance(Type.GetType(repositoryName));
return(TService)Activator.CreateInstance(typeof(TService),repository);
}
这感觉不明显,也不直观,也许有更好、更健壮的解决方案可用

也许使用一种更合适的方法


使用容器,我只需解析
UserService
,并让容器注入适当的存储库。如果
UserService
是来自其他事物的依赖项,那么让DI容器解决这个问题,现代容器将解决依赖项的依赖项。

@vcsjones您能详细解释一下您的意思吗?通常,我使用我的工厂来进行DIing(正如您所看到的,服务需要一个存储库,而我的工厂负责这个)。这不是再次要求每个服务都有一个具体的实现吗?另外,请在回答部分为代表张贴@vcsjones您是正确的,删除new()成功了。因此,请先生在答案部分发布@你能解释一下你的意思吗?通常,我使用我的工厂来进行DIing(正如您所看到的,服务需要一个存储库,而我的工厂负责这个)。这不是再次要求每个服务都有一个具体的实现吗?另外,请在回答部分为代表张贴@vcsjones您是正确的,删除new()成功了。因此,请先生在答案部分发布!谢谢,我确实想到了第一个方法,但是约定总是存在的,我希望方法调用尽可能简单。对于您的DI容器注释仍然有点困惑,因为当前工厂已经在使用您的链接中提到的依赖项注入了?你能举一个简单的例子吗,即使在伪代码中也会有帮助吗?谢谢,我确实想到了第一个方法,但是约定总是存在的,我想让方法调用尽可能简单。对于您的DI容器注释仍然有点困惑,因为当前工厂已经在使用您的链接中提到的依赖项注入了?你能举个简单的例子吗,即使是伪代码也会有帮助?