使用自定义数据属性在方法中注入参数,这可能吗?

时间:2015-06-05 19:25:24

标签: c# linq-to-sql

我想创建一些数据属性来装饰我正在使用的系统方法。我在系统应用程序的许多方面看到,开发人员基于某些信息实例化数据库上下文。这样的事情:

public IQueryable<Customers> ListCustomersByName(Username user, Password password, string firstName)
{
    var context = DatabaseContextFactory(user, password);
    return context.Customers.Where(c => c.FirstName == firstName);
}

看来,实际上,我的方法只需要一个信息来寻找客户,即客户的名字。这里还有很多其他类似的方法。 我的想法是做那样的事情:

[UsesDatabaseAttribute]
public IQueryable<Customers> ListCustomersByName(Database context, string firstName)
{
    return context.Customers.Where(c => c.FirstName == firstName);
}

然后,我将调用我的方法传递,用户名,密码和名称进行搜索。这样的事情:

public static void Main()
{
    var customers = ListCustomersByName(username, password, firstName);
    //... Use this list to do anything
}

我的DataAttribute将接收,翻译并调用传递数据库上下文的方法。

简而言之,我希望从每个方法中删除实例化数据库的所有逻辑,并将其集中到装饰方法的属性中。

试图举例说明,我的想法与下面的代码相同,但不是让方法重载,我想要使用数据属性的装饰方法(因为这个场景与其他方法和其他表重复,我想避免重载每个不同的表格):

public IQueryable<Customers> ListCustomersByName(Username user, Password password, string firstName)
{
     var context = DatabaseContextFactory(user, password);
     return ListCustomersByName(context, firstName);
}

public IQueryable<Customers> ListCustomersByName(Database context, string firstName)
{
    return context.Customers.Where(c => c.FirstName == firstName);
}

public static void Main()
{
    var customers = ListCustomersByName(username, password, firstName);
    //... Use this list to do anything
}

那是可能的吗?

1 个答案:

答案 0 :(得分:1)

据我所知,您希望将依赖项(上下文)注入包含访问数据库方法的类。为此您可以使用一些DI容器,例如尝试统一https://msdn.microsoft.com/en-us/library/ff648211.aspx 代码将如下所示:

class ContextFactory
{
  public Context Create(string userName, string Password)
  {
  //creating context
  }
}

class SomeClass
{
  private ContextFactory _factory;
  public SomeClass(ContextFactory factory)
  {
    _factory = factory;
  }

  public IQueryable<Customers> ListCustomersByName(Username user, Password password, string firstName)
  {
      var context = _factory.Create(user, password);
      return customers.Where(c => c.FirstName == firstName);
  }
}

public static void Main()
{
  //creating container and register dependency
  var container = new UnityContainer();
  container.RegisterType<ContextFactory>();

  var someClass = container.Resolve<SomeClass>();

  var customers = someClass.ListCustomersByName(username, password, firstName);
    //... Use this list to do anything
}